On Don, 08 Aug 2002 at 09:39 (+0200), Mario Streiber wrote:
Am besten, Du startest folgende Schleife (das kannst Du übrigens direkt in einer Konsole so eingeben, Du brauchst kein Shell-Script dafür) und studierst in der Zwischenzeit das bash-Manual ;-):
for i in *.wav; do mpg123 -w "$i" "`basename $i .wav`.mp3" done
Jetzt muß ich mich aber doch noch in die Diskussion einklinken :-)
mpg123 soll doch die mp3's in wav's umwandeln, oder? D.h. im Normalfall gibt es vorher keine .wav Files -> "for i in *.wav" ist der falsche Ansatz. Das erste Script mit "for i in *.mp3" war da schon soweit OK.
Das hatte ich andersrum verstanden - wenn es so ist, dann sorry für die Verwirrung. Aber funktioniert hätte es trotzdem nicht, die Ersetzung "$file.wav" ist nämlich nicht richtig (bzw. es hätten als Ergebnis lauter Dateien namens trackx.mp3.wav existiert, was sicher nicht im Sinne des Erfinders war ;-).
Und mit der Quotierung muß man auch sehr umsichtig umgehen, besonders wenn (wie bei MP3 Files nicht unüblich) Leerzeichen im Dateinamen vorkommen. In einem solchen Fall funktioniert obiges Script nicht.
Stimmt, an einer Stelle habe ich die Quotes vergessen - nämlich für das Argument von basename.
Konsequenterweise muß auch die mpg123 Zeile angepaßt werden. Das Script sähe dann so aus:
for i in *.mp3; do mpg123 -w "$(basename "$i" .mp3).wav" "$i" done
Oder (jetzt die Version wav -> mp3): for i in *.mp3; do mpg123 -w "`basename "$i" .mp3`.wav" "$i" done
Ich bevorzuge übrigens $(...) gegenüber `...`. Macht das gleiche, ist aber besser von den anderen Quote-Zeichen '...' zu unterscheiden.
Die $(...) Syntax funktioniert ausschließlich in der bash. Ich versuche aus Gewohnheit weitgehend kompatibel zu anderen Shells und Unixen zu bleiben. Außerdem haben die () noch eine andere Bedeutung: Sie lassen die eingeschlossenen Befehle in einer Subshell laufen - da ist mir `` lieber. Aber das ist schon wieder fast ein Glaubenskrieg ;-) Beispiel: jan@k500:~> x=0; ( x=1; echo $x ); echo $x 1 0 jan@k500:~> Übrigens, wenn Du bash-Spezifika nutzt, geht es auch kürzer: "${i//.mp3/.wav}" statt "$(basename "$i" .mp3).wav" Es darf dann nur kein .mp3 vor der Dateiendung auftauchen. Jan P.S.: Bitte nicht an die Liste _und_ an mich antworten. Ich brauche die Mails nicht zweimal.