Ich muss Videos konvertieren, aber ich weiß nicht, wo sie sind, also brauche ich find
sie. Wie kann ich FFmpeg mit dem Ergebnis und einem Ausgabedateinamen versehen xargs
?
Ich habe bereits herausgefunden, dass ich mit diesem Befehl die beiden Parameter konstruieren kann:
find . -iname "*.mov" -printf "%p %f\n"
Ich kann nichts im xargs
Handbuch finden. Ich möchte so etwas:
find . -iname "*.mov" -printf "%p %f\n" | xargs ffmpeg -i {param1} -f flv {param2}
Wie kann ich das machen?
command-line
bash
xargs
command-line-arguments
kissgyorgy
quelle
quelle
xargs
im Allgemeinen suchen, möchten vielleicht stackoverflow.com/questions/3770432/… .Antworten:
So etwas erledigt den Trick und erhält den vollständigen Pfad, behandelt den Speicherplatz, benennt ihn
folder/movie.mov
umfolder/movie.flv
in usw.Und wenn ich Sie missverstanden habe und Sie alle .flv-Filme im aktuellen Verzeichnis haben möchten, verwenden Sie stattdessen dieses:
quelle
Der Grund, den die Benutzer
xargs
in Kombination mit find verwenden, besteht darin, dass bei jedem Programmstart mehrere Dateinamen an denselben Programmaufruf übergeben werdenxargs
. Wenn beispielsweisefind
die Dateien foo , bar und baz zurückgegeben werden , wird Folgendesmv
nur einmal ausgeführt:Tatsächlich lautet der Aufruf
mv
wie folgt:Wenn Sie dieses Verhalten nicht benötigen oder wollen (wie ich hier annehme), können Sie einfach
find
's verwenden-exec
.In diesem Fall besteht eine einfache Lösung darin, ein kurzes Shell-Skript wie das folgende zu schreiben:
Speichern unter
myffmpeg.sh
und ausführenchmod +x myffmpeg.sh
. Führen Sie dann Folgendes aus:Dadurch wird das Shell-Skript für jede gefundene Datei einmal aufgerufen. Das Shell-Skript extrahiert wiederum den Dateinamen aus dem vollständigen Pfad und ruft
ffmpeg
mit den entsprechenden Argumenten auf.quelle
Ich habe nicht die Lösung bekommen, die ich erwartet hatte, also habe ich meine eigene herausgefunden. @ Daniels Antwort ist gut, aber es braucht ein Shell-Skript. Ein Einzeiler ist schneller, und ich mag es besser :) auch einfachere Lösung als das Schreiben eines Skripts.
Ich könnte ein Argument verwenden und es mit
basename
und mit verarbeitensh -c
Das -i weist xargs an, es
{}
durch das aktuelle Argument zu ersetzen .Die Befehlsausgabe innerhalb von `` wird als Standardausgabe (Bash-Funktion)
basename {}
ausgedruckt und als Dateiname ausgewertet und ausgedruckt.-0 für die korrekte Behandlung spezieller Dateinamen, aber Sie müssen Parameter mit der Option -print0 mit find übergeben
quelle
Sie müssen es wie alle Antworten dort oben tun, aber die GENAUE Verwendung von xargs wird ungefähr so aussehen:
In Ihrem Fall ist es also:
PS: Dies beantwortet die Frage nach xargs für diejenigen, die genau nach einer Antwort für mehrere
xargs
Parameter in einemxargs
Befehl suchen .quelle
Warum verschieben Sie nicht einfach die Optionen des ffmpeg , um sie an das Format der Ergebnisse des Befehls find anzupassen?
Beachten Sie das Hinzufügen der Option -r zu xargs , um zu verhindern, dass ffmpeg ausgeführt wird, wenn keine MOV- Dateien gefunden werden.
Ich habe xargs die Option -n2 hinzugefügt , um die Anzahl der xargs- Prozesse auf zwei zu beschränken. In diesem Fall sind die Elemente der Dateipfad und der Dateiname. Wenn keine Option -n festgelegt ist, verarbeitet xargs so viele Eingabeelemente wie möglich in einer einzigen Ausführung.
quelle
Ich bin mir nicht sicher, ob du das kannst oder wie du das mit xargs machst.
Aber so etwas sollte für Sie funktionieren:
quelle
Eine Alternative zu Zoredaches Antwort mithilfe der Namensbindung (und mithilfe verschiedener Trennzeichen, um Leerzeichen in Dateinamen zu vermeiden):
Natürlich können Sie die Trennzeichen auch mit dem
find -a array
Argument verwenden, das die andere Antwort verwendet hat, aber manchmal sind benannte Argumente verständlicher.quelle
Sie können ffmpeg direkt über den Befehl find wie folgt ausführen:
Beachten Sie die Anführungszeichen um die Parameter für ffmpeg, falls der Dateiname Leerzeichen enthält und das Semikolon das Ende des ausgeführten Befehls markiert.
quelle