bash loop: Verzeichnisse mit Leerzeichen

Started by cas, 2017/01/25, 19:11:46

Previous topic - Next topic

cas

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

melmarker

Those who would give up essential Liberty, to purchase a little temporary Safety, deserve neither Liberty nor Safety. (Benjamin Franklin, November 11, 1755)
Never attribute to malice that which can be adequately explained by stupidity. (Hanlons razor)

cas

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

musca

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
,,Es irrt der Mensch, solang er strebt."  (Goethe, Faust)

cas


cas

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




cas


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'

melmarker

Those who would give up essential Liberty, to purchase a little temporary Safety, deserve neither Liberty nor Safety. (Benjamin Franklin, November 11, 1755)
Never attribute to malice that which can be adequately explained by stupidity. (Hanlons razor)


melmarker

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-
Those who would give up essential Liberty, to purchase a little temporary Safety, deserve neither Liberty nor Safety. (Benjamin Franklin, November 11, 1755)
Never attribute to malice that which can be adequately explained by stupidity. (Hanlons razor)

musca

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.
,,Es irrt der Mensch, solang er strebt."  (Goethe, Faust)

melmarker

Those who would give up essential Liberty, to purchase a little temporary Safety, deserve neither Liberty nor Safety. (Benjamin Franklin, November 11, 1755)
Never attribute to malice that which can be adequately explained by stupidity. (Hanlons razor)