[Date Prev][Date Next] [Thread Prev][Thread Next] [Date Index] [Thread Index]

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: