Wie kann ich einen Befehl für jede Datei in einem bestimmten Verzeichnis ausführen?

1467
usr122212

Ich verwende mp4boxdie MOOV-Atome in MP4-Dateien.

Die Sache ist, ich habe 6 Dateien in einem bestimmten Ordner und ich möchte den inter 500Befehl nicht sechsmal ausführen .

Ist es möglich, etwas mp4box -inter 500 *in einem Verzeichnis auszuführen, damit der Befehl für alle mp4-Dateien in diesem Ordner ausgeführt wird?

0

1 Antwort auf die Frage

5
terdon

Sie können die -execOption von verwenden find. Hier '{}'wird durch den Dateinamen jeder MP4-Datei ersetzt. Hier werden alle Arten von Dateinamen behandelt, auch solche, die Leerzeichen oder Zeilenumbrüche enthalten. Sie müssen angeben -maxdepth 1, dass nur das aktuelle Verzeichnis durchsucht werden soll.

find . -iname "*.mp4" -maxdepth 1 -exec mp4box -inter 500 '{}' \; 

Ein alternativer, komplizierterer Weg würde das Piping der Ausgabe findin eine Schleife mit einschließen read. Hier ist jede Datei durch das NULZeichen begrenzt, und Sie müssen readdie Eingabe für dieses Zeichen aufteilen, was durch erreicht wird -d ''. Sie müssen auch die Variable in Anführungszeichen setzen "$file", damit Leerzeichen oder Globbing-Zeichen im Namen erhalten bleiben.

find . -iname "*.mp4" -maxdepth 1 -print0 | while IFS= read -d '' -r file; do mp4box -inter 500 "$file"; done 
nachdem ich das obige ausgeführt habe, bekomme ich folgendes: `ce_002.mp4: unknown primary oder operator` mache ich hier etwas falsch? usr122212 vor 11 Jahren 0
Nun, das einzige, woran ich denken kann, ist, dass Ihre Dateinamen seltsame Zeichen enthalten ... Versuchen Sie es mit der aktualisierten Antwort. terdon vor 11 Jahren 0
danke für deine aktualisierte antwort! funktioniert super. Ich sollte mehr über exec erfahren. usr122212 vor 11 Jahren 0
Ich habe ein paar Korrekturen vorgenommen. Das Globbingmuster in `-name` sollte immer in Anführungszeichen gesetzt werden. Andernfalls wird der Globus '*' erweitert, bevor `find` es überhaupt sieht. Dies bedeutet, dass der Befehl fehlschlägt, wenn Sie in einem anderen Verzeichnis als dem aktuellen suchen oder tiefer als eine Ebene gehen würden. Mit der Option -exec werden auch alle Arten von Dateinamen behandelt. Die Verwendung von "xargs" ist nicht wirklich notwendig - die "while" -Schleife funktioniert besser, aber hier sollte die Ausgabe mit Nullen getrennt werden. slhck vor 11 Jahren 2
danke für dein edit und details, das funktioniert einwandfrei! usr122212 vor 11 Jahren 0