Siduction Forum

Siduction Forum => Scripting & Kernelhacking => Topic started by: cas on 2017/01/25, 19:11:46

Title: bash loop: Verzeichnisse mit Leerzeichen
Post by: cas on 2017/01/25, 19:11:46
EDIT:
I would like to iterate over directories in bash.
I dont know how to do it, when directories have empty space in their names.
+++++++++++++++++++++++++++++++++++++++++++


Hallo,
ich möchte über Verzeichnisnamen iterieren, bspw mit einer for-Schleife.

Was mache ich, wenn Verzeichnisnamen Leerzeichen enthalten?

Bspw im CWD habe ich die Verzeichnisse "bla bla bla", "foo bar", etc , über die iteriert werden soll.

Bislang habe ich die Verzeichnisnamen immer umbenannt, so dass keine Leerzeichen mehr vorkamen, aber das muss doch anders gehen.


Grüße, C
Title: Re: bash loop: Verzeichnisse mit Leerzeichen
Post by: melmarker on 2017/01/25, 19:26:11
wie wäre es mit Anführungszeichen
Title: Re: bash loop: Verzeichnisse mit Leerzeichen
Post by: cas on 2017/01/25, 19:58:22
Leider funktioniert das nicht.

Code: [Select]
$ mkdir "bla bla bla" "foo bar"

$ for DIR in  "bla\ bla\ bla" "foo\ bar" ; do cd $DIR; ls ;  cd - ;done
bash: cd: Zu viele Argumente.

$ for DIR in  'bla\ bla\ bla' 'foo\ bar' ; do cd $DIR; ls ;  cd - ;done
bash: cd: Zu viele Argumente.

Außerdem würde ich dies gerne generieren lassen, ähnlich wie ls, falls es mal sehr viele Verzeichnisse sind, bzw damit ich es immer wieder verwenden kann.

Gruss, C
Title: Re: bash loop: Verzeichnisse mit Leerzeichen
Post by: musca on 2017/01/25, 20:06:56
Hallo cas,

das Problem ist dein
Code: [Select]
cd $DIR
die shell ersetzt zuerst den Variablennamen durch deren Inhalt, dann wird die entstehende Zeile interpretiert.
Dabei enstehen im Allgemeinen durch die Leerzeichen neue Bedeutungen.

melmarker meinte genau diese Lösung:
Code: [Select]
cd "$DIR"
Dabei verhindern die Anführungsstriche, dass der Verzeichnisname in mehrere Argumente zerfällt.

bashly greetings
musca
Title: Re: bash loop: Verzeichnisse mit Leerzeichen
Post by: cas on 2017/01/25, 20:22:32
verstehe.
danke!
Title: Re: bash loop: Verzeichnisse mit Leerzeichen
Post by: cas on 2017/01/25, 21:34:01
Soweit, so gut. Aber jetzt kommt die Preisfrage.  :)

Wie kann ich die Verzeichnisnamen automatisiert der Variable $DIR zuweisen?
Ich bekomme entweder 1 String oder 5 Strings. Da es aber zwei Verzeichnisse sind, müssten es 2 Strings sein.

NB: Eigentlich will ich in die Verzeichnisse rein, aber bereits ls funktioniert nicht.

Code: [Select]
$ echo "$(ls)"
bla bla bla
foo bar

$ for DIR in  "$(ls)"; do  ls "$DIR"  ;done
ls: Zugriff auf 'bla bla bla'$'\n''foo bar' nicht möglich: Datei oder Verzeichnis nicht gefunden


Code: [Select]
$ ls -Q
"bla bla bla"  "foo bar"
for DIR in  $(ls -Q); do  ls "$DIR"  ;done
ls: Zugriff auf '"bla' nicht möglich: Datei oder Verzeichnis nicht gefunden
ls: Zugriff auf 'bla' nicht möglich: Datei oder Verzeichnis nicht gefunden
ls: Zugriff auf 'bla"' nicht möglich: Datei oder Verzeichnis nicht gefunden
ls: Zugriff auf '"foo' nicht möglich: Datei oder Verzeichnis nicht gefunden
ls: Zugriff auf 'bar"' nicht möglich: Datei oder Verzeichnis nicht gefunden



Code: [Select]
ls --quoting-style=shell
'bla bla bla'  'foo bar'

$ for DIR in  $(ls --quoting-style=shell); do  ls "$DIR"  ;done
ls: Zugriff auf "'bla" nicht möglich: Datei oder Verzeichnis nicht gefunden
ls: Zugriff auf 'bla' nicht möglich: Datei oder Verzeichnis nicht gefunden
ls: Zugriff auf "bla'" nicht möglich: Datei oder Verzeichnis nicht gefunden
ls: Zugriff auf "'foo" nicht möglich: Datei oder Verzeichnis nicht gefunden
ls: Zugriff auf "bar'" nicht möglich: Datei oder Verzeichnis nicht gefunden



Code: [Select]
$ echo "$(ls -b)"
bla\ bla\ bla
foo\ bar

cas@cinna:~/bla$ for DIR in  "$(ls -b )"; do  ls "$DIR"  ;done
ls: Zugriff auf 'bla\ bla\ bla'$'\n''foo\ bar' nicht möglich: Datei oder Verzeichnis nicht gefunden

cas@cinna:~/bla$ for DIR in  $(ls -b ); do  ls "$DIR"  ;done
ls: Zugriff auf 'bla\' nicht möglich: Datei oder Verzeichnis nicht gefunden
ls: Zugriff auf 'bla\' nicht möglich: Datei oder Verzeichnis nicht gefunden
ls: Zugriff auf 'bla' nicht möglich: Datei oder Verzeichnis nicht gefunden
ls: Zugriff auf 'foo\' nicht möglich: Datei oder Verzeichnis nicht gefunden
ls: Zugriff auf 'bar' nicht möglich: Datei oder Verzeichnis nicht gefunden


Title: Re: bash loop: Verzeichnisse mit Leerzeichen
Post by: cas on 2017/01/25, 21:42:13

Angabe von "LANG=C" erzeugt Syntaxfehler ?!!


Code: [Select]
$ for DIR in  foo\ bar/ bla\ bla\ bla/; do  echo "$DIR"  ;done
foo bar/
bla bla bla/


$ LANG=C for DIR in  foo\ bar/ bla\ bla\ bla/; do  echo "$DIR"  ;done
bash: Syntaxfehler beim unerwarteten Wort `do'
Title: Re: bash loop: Verzeichnisse mit Leerzeichen
Post by: melmarker on 2017/01/25, 22:17:34
$IFS heisst glaube ich das Zauberwort
Title: Re: bash loop: Verzeichnisse mit Leerzeichen
Post by: cas on 2017/01/25, 22:19:28
danke,
habe ich auch gerade gefunden

https://www.cyberciti.biz/tips/handling-filenames-with-spaces-in-bash.html
Title: Re: bash loop: Verzeichnisse mit Leerzeichen
Post by: melmarker on 2017/01/25, 22:23:56
und ab da wird es ekelig - ifs (internal fieldname separator) müsste dann vor der schleife gesetzt werden und nach der schleife zurückgesetzt- weil man sich sonst irgendwann fürchterlich die Füsse wegschießt-
Title: Re: bash loop: Verzeichnisse mit Leerzeichen
Post by: musca on 2017/01/25, 23:17:00
Die Ausgabe von ls ist definitiv nur für Menschen zum Lesen gedacht.

Die Shell kann sich ganz leicht selbst Verzeichnisse oder Dateien ansehen:

Code: [Select]
user@sidbox:~$ for my_dir in *; do if [[ -d ${my_dir} ]]; then printf "%s\n" "${my_dir}"; fi done
bin
bla bla bla
Desktop
Downloads
foo bar
iota
jessie
lib
Pictures
sid
VirtualBox VMs

user@sidbox:~$ for my_dir in {'bla bla bla',foo\ bar}; do if [[ -d ${my_dir} ]]; then printf "%s\n" "${my_dir}"; fi done
bla bla bla
foo bar

Ih gitt, ich habe auch ein Verzeichnis mit einem Space im Namen.
Title: Re: bash loop: Verzeichnisse mit Leerzeichen
Post by: melmarker on 2017/01/26, 00:00:06
was hat nu git damit zu tun :D