Re: Leerzeichen in Dateinamen
Am Samstag, 9. Oktober 2004 23:11 schrieb Uwe Malzahn:
> Am Samstag, 9. Oktober 2004 21:45 schrieb Dirk Richter:
> > for i in `ls *.jpg` ; do echo $i ; done
[...]
> for i in *.jpg ; do echo $i ; done
> /tmp$ ls *.jpg
> bar.jpg foo bar.jpg foo.jpg
> /tmp$ for i in *.jpg ; do echo $i ; done
> bar.jpg
> foo bar.jpg
> foo.jpg
Das ist nicht das Gleiche:
jan@jack:~/tmp/leer> touch "a b c.jpg" "a b c.jpg"
jan@jack:~/tmp/leer> ls -l
insgesamt 0
-rw-r--r-- 1 jan users 0 2004-10-10 01:29 a b c.jpg
-rw-r--r-- 1 jan users 0 2004-10-10 01:29 a b c.jpg
jan@jack:~/tmp/leer> for i in *.JPG; do echo $i; done
*.JPG
jan@jack:~/tmp/leer> for i in `ls *.JPG`; do echo $i; done
/bin/ls: *.JPG: Datei oder Verzeichnis nicht gefunden
Und noch was: Vorsicht mit ungequoteten Argumenten:
jan@jack:~/tmp/leer> for i in *.jpg; do echo $i; done
a b c.jpg
a b c.jpg
jan@jack:~/tmp/leer> for i in *.jpg; do echo "$i"; done
a b c.jpg
a b c.jpg
Mit folgender Variante klappt es auch mit Leerzeichen:
jan@jack:~/tmp/leer> ls *.jpg | while read i; do echo "$i"; done
a b c.jpg
a b c.jpg
jan@jack:~/tmp/leer> ls *.JPG | while read i; do echo "$i"; done
/bin/ls: *.JPG: Datei oder Verzeichnis nicht gefunden
Der Nachteil ist hier, dass die Schleife in einer Subshell abläuft
(also innerhalb der Schleife gesetzte Variablen aussen nicht
sichtbar sind):
jan@jack:~/tmp/leer> f="xyz"
jan@jack:~/tmp/leer> ls *.jpg | while read i; do f="$i"; done
jan@jack:~/tmp/leer> echo $f
xyz
Will man das umgehen, dann greift man doch wieder auf die
for-Schleife zurück und stellt in der Schleife sicher, dass es
tatsächlich Dateien gibt:
jan@jack:~/tmp/leer> for i in *.JPG; do test -f "$i" || break; echo
"$i"; done
Jan
P.S.: Die "Intelligenz" der for-Schleife ist nicht kompatibel zu
anderen Shells.
--
Linux-Quickies: http://www.jan-trippler.de
PingoS: http://www.pingos.org
Reply to: