Siduction Forum
Siduction Forum => Scripting & Kernelhacking => Topic started 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
-
wie wäre es mit Anführungszeichen
-
Leider funktioniert das nicht.
$ 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
-
Hallo cas,
das Problem ist dein
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:
cd "$DIR"
Dabei verhindern die Anführungsstriche, dass der Verzeichnisname in mehrere Argumente zerfällt.
bashly greetings
musca
-
verstehe.
danke!
-
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.
$ 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
$ 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
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
$ 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
-
Angabe von "LANG=C" erzeugt Syntaxfehler ?!!
$ 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'
-
$IFS heisst glaube ich das Zauberwort
-
danke,
habe ich auch gerade gefunden
https://www.cyberciti.biz/tips/handling-filenames-with-spaces-in-bash.html
-
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-
-
Die Ausgabe von ls ist definitiv nur für Menschen zum Lesen gedacht.
Die Shell kann sich ganz leicht selbst Verzeichnisse oder Dateien ansehen:
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.
-
was hat nu git damit zu tun :D