Es mag überraschen, -exec
kann aber als Test beim find
Aufruf verwendet werden:
find -type f -exec sh -c 'ffprobe -show_streams 2>/dev/null "$1" | grep -q coded_height=720' sh {} \; -print
Der obige Befehl wird in Unterverzeichnisse absteigen. Um nur im aktuellen Verzeichnis zu suchen -maxdepth 1
, verwenden Sie:
find -maxdepth 1 -type f -exec …
Beachten Sie, dass ffprobe
alle Dateien getestet werden. Bei Nicht-Mediendateien schlägt dies offensichtlich fehl, aber .jpg
in der endgültigen Ausgabe werden möglicherweise Nicht-Videomedien (wie ) angezeigt . Um dies zu vermeiden, find
sollten vorher einige zusätzliche Tests durchgeführt werden -exec
, zB:
find -maxdepth 1 -type f \( -iname "*.avi" -o -iname "*.mp4" -o -iname "*.mkv" \) -exec sh -c 'ffprobe -show_streams 2>/dev/null "$1" | grep -q coded_height=720' sh {} \; -print
Oder besser, Sie können MIME-Typ testen mit file
:
find -maxdepth 1 -exec sh -c 'file --mime-type "$1" | grep -q "video/"' sh {} \; -exec sh -c 'ffprobe -show_streams 2>/dev/null "$1" | grep -q coded_height=720' sh {} \; -print
Lesen Sie man find
, um mehr zu erfahren.
BEARBEITEN:
Dieser Befehl (falsch) verwendet avconv
, wie Sie angefordert haben:
find -exec sh -c 'file --mime-type "$1" | grep -q "video/"' sh {} \; -exec sh -c 'avconv 2>&1 -i "$1" | grep -q "Stream.*x720"' sh {} \; -print
Das Problem ist, dass jeder Aufruf avconv
einen Fehler auslöst. Wir ignorieren es einfach und extrahieren die benötigten Informationen. Das ist eine etwas hässliche Lösung. Ich bin mir nicht ganz sicher, ob Sie avconv
sich so verhalten wie ich. Möglicherweise müssen Sie sie durch Stream.*x720
einen anderen regulären Ausdruck ersetzen .
Was ist falsch an meiner kombinierten Befehlsfolge?
find -exec
erfordert das Schließen mit \;
oder +
,
gibt es $(
ohne)
nachdem du die ""
frage bearbeitet hast sind verschachtelt (nicht verschachtelt) mit $()
,
*720*
kann Shell Globbing auslösen, sollte "*720*"
(ich spreche sh
, nicht die äußere Schale),
- Die Ausgabe, die
avconv
Sie versuchen zu analysieren, geht an stderr
. Ich denke, Sie müssen sie umleiten, bevor Sie sie analysieren können.
- und vielleicht noch etwas anderes.
ffprobe video.mp4
. Dabei wird kein Fehleravconv
ausgegeben.