Hallo, Am Sat, 01 Nov 2003, Dieter Kroemer schrieb:
Worin liegt eigentlich der Unterschied der folgenden Vorgehensweisen, bzw. wann ist welches Vorgehen zu bevorzugen:
for i in $(ls *.wav); do lame --alt-preset 112 $i $i.112.mp3; done
bzw.
ls *.wav|xargs -iP lame --alt-preset 112 P P.112.mp3
$ for f in $(ls * ); do :; done bash: /bin/ls: Argument list too long $ for f in *; do :; done $ ls * | xargs -iF echo F bash: /bin/ls: Argument list too long $ ls . | grep '.' | xargs -iF F >/dev/null $ Grund: das * wird beim ersten und der dritten Version ersetzt bevor 'ls' was zu sehen bekommt. Im zweiten Fall fuetter die shell _intern_ das for mit der Expandierung des *, im letzten Fall wird gar nicht expandiert. Ansonsten geben sich die beiden Varianten wenig, allerdings ruft die Variante mit xargs eben dieses zusaetzlich auf ;) Aber dazu kommt das Problem mit Sonderzeichen, da fliegen das 'for *', das for `` bzw. for $() gleich wieder raus. Zuverlaessiger sind: ls <VERZEICHNIS> | grep 'MUSTER_RE' | while read filename; do \ lame --alt-preset 112 "$filename" "${filename//.wav/_112.mp3}"; \ done Oder: find <VERZEICNIS> -name "MUSTER_GLOB" | while read f; do \ ... done Oder (portabler): ls <VERZEICHNIS> | grep 'MUSTER_RE' | while read filename; do \ lame --alt-preset 112 "$filename" \ "`basename \"${filename}\" .wav`_112.mp3"; \ done oder: ls <VERZEICHNIS> | grep 'MUSTER_RE' | while read filename; do \ lame --alt-preset 112 "$filename" \ "`echo \"${filename}\" | sed 's/\.wav$/_112.mp3/'`"; \ done Hier hast du aber immer noch Probleme mit " und mit Zeilenumbruechen im Namen. Noch besser ist also: find <VERZEICHNIS> -name "MUSTER_GLOB" -exec lame "{}" "{}_112.mp3" \; mmv "*.wav_112.mp3" "#1_112.mp3" HTH, -dnh -- Linux is not a desktop OS for people whose VCRs are still flashing "12:00". -- Paul Tomblin