Ich bin relativ neu in Bash und versuche, etwas zu tun, das auf den ersten Blick ziemlich einfach zu sein schien - führen Sie find über eine Verzeichnishierarchie aus, um alle * .wma-Dateien abzurufen, und leiten Sie diese Ausgabe an einen Befehl weiter, in dem ich sie in mp3 und konvertiere Speichern Sie die konvertierte Datei als .mp3. Meiner Meinung nach sollte der Befehl wie folgt aussehen (ich habe den Befehl zur Audiokonvertierung weggelassen und verwende stattdessen Echo zur Veranschaulichung):
$ find ./ -name '*.wma' -type f -print0 | xargs -0 -I f echo ${f%.*}.mp3
So wie ich es verstehe, kann ich mit dem Argument -print0 Dateinamen mit Leerzeichen verarbeiten (was viele davon tun, da es sich um Musikdateien handelt). Ich erwarte dann (als Ergebnis von xargs), dass jeder Dateipfad von find in f erfasst wird und dass ich unter Verwendung der Teilzeichenfolge match / delete am Ende der Zeichenfolge den ursprünglichen Dateipfad mit einer MP3-Datei wiedergeben sollte Erweiterung statt wma. Anstelle dieses Ergebnisses sehe ich jedoch Folgendes:
*.mp3
*.mp3
*.mp3
*.mp3
*.mp3
*.mp3
*.mp3
*.mp3
*.mp3
...
Meine Frage (abgesehen von der spezifischen Frage, was ich hier falsch mache) lautet also: Müssen Werte, die das Ergebnis einer Pipe-Operation sind, bei String-Manipulationsoperationen anders behandelt werden als diejenigen, die das Ergebnis einer Variablenzuweisung sind ?
{}
Mitglied)
xargs
besser geeignet ist als exec
. Ein Beispiel hierfür finden Sie in diesem Stackpost stackoverflow.com/questions/896808/find-exec-cmd-vs-xargs .
xargs
mit zu verwendenfind
. Es kommt mit einer-exec
Option. Können Sie Ihrer Frage einfach den Befehl hinzufügen, den Sie verwenden möchten, und jemand kann Ihnen den richtigenfind
Befehl zeigen?