Linux: Wie liste ich alle Videodateien mit einer Auflösung von genau 720p auf?

0

Ich habe mehrere Videodateien mit unterschiedlichen Auflösungen. Jetzt möchte ich nur die Videodateinamen mit zB 720p Auflösung auflisten. Ich bevorzuge ein Liner in der Bash-Befehlszeile und kann hilfreiche Videoinformationen einschließlich der Auflösung erhalten, wenn ich Folgendes ausführe:

avconv -i video.mp4

aber diese Kombination:

find -exec sh -c 'if [[ "$(avconv -i {}") == *720* ]] ; then echo 720 found; fi;'

erzeugt den Fehler: exec - fehlendes Argument.

Ich bin ehrlich, ich habe kaum Streit mit Bash-Kommandostrukturen, insbesondere mit kombinierten Kommandos. Was ist also falsch an meiner kombinierten Befehlszeichenfolge?

Danke.

Linuxwhisperer
quelle
Diese Informationen, die Sie benötigen, werden von zurückgegeben ffprobe video.mp4. Dabei wird kein Fehler avconvausgegeben.
Kamil Maciorowski

Antworten:

1

Vielleicht erfüllt dieser Befehl das, wonach Sie suchen:

for i in *.mp4; do if [[ $(avconv -i $i) =~ .*720.* ]]; then echo $i; fi; done
Cedric Zoppolo
quelle
Dies war ein Schritt vorwärts. Nachdem ich "; done" nach "fi" eingefügt habe, hat es funktioniert, aber mit vielen, vielen Ausgabezeilen von "avconv". Ich möchte diese Zeilen unterdrücken. Ich möchte nur die passenden Dateien erhalten und dann den Namen der Datei auflisten.
Linuxwhisperer
Du hast recht. Ich habe das vergessen done. Habe es gerade bearbeitet.
Cedric Zoppolo
Wenn Sie den Namen der Datei ausgeben möchten, können Sie dies einfach echo $ianstelle von tun echo 720 found.
Cedric Zoppolo
Ich habe das avconv-Programm nicht installiert und kann es daher nicht testen. Aber ich denke, es gibt einige Optionen, um Debugging oder zusätzliche Ausgaben zu vermeiden, die Sie von diesem Programm nicht wollen. Versuchen Sie man avconvoder apropos avconvum Hilfe zu diesem Programm.
Cedric Zoppolo
Unter manpages.ubuntu.com/manpages/precise/man1/avconv.1.html habe ich -loglevel options gefunden
Cedric Zoppolo 22.06.17
0

Im Moment habe ich eine brauchbare Lösung gefunden:

 for i in ls *.m??; do sm=$(mediainfo $i | grep Height | sed 's/  //g');if [[ "$sm" == *720* ]]; then printf "Video: %-s $i %-s $sm \n"; fi; done

Hier kann ich alle m ?? Video-Dateien und drucken Sie den Namen einschließlich "720" Zustand. Ohne den if Teil könnte ich mir alle Videos und deren Auflösungen anzeigen lassen.

Ich habe dies mit Hilfe anderer Antworten hier herausgearbeitet.

Wenn ich versuche, find und exec mit dem do-Teil der obigen Lösung zu kombinieren, erhalte ich nur die Meldung "E: Fehler beim Lesen der Datei" als Ergebnis von mediainfo für jeden Betreff:

 find -exec mediainfo "{}" \; -exec bash -c 'sm=$(mediainfo ${} | grep 720) : ; echo $sm' \;

Wie gesagt, die "Wenn" -Konstruktion funktioniert (für das aktuelle Verzeichnis), aber ich werde versuchen, sie auch mit find zum Laufen zu bringen.

Linuxwhisperer
quelle
Oh, tut mir leid, dass ich gesprächig bin. Ich habe jetzt gelesen ...
Linuxwhisperer
0

Es mag überraschen, -execkann aber als Test beim findAufruf 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 ffprobealle Dateien getestet werden. Bei Nicht-Mediendateien schlägt dies offensichtlich fehl, aber .jpgin der endgültigen Ausgabe werden möglicherweise Nicht-Videomedien (wie ) angezeigt . Um dies zu vermeiden, findsollten 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 avconveinen 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 avconvsich so verhalten wie ich. Möglicherweise müssen Sie sie durch Stream.*x720einen anderen regulären Ausdruck ersetzen .


Was ist falsch an meiner kombinierten Befehlsfolge?

  • find -execerfordert 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 avconvSie versuchen zu analysieren, geht an stderr. Ich denke, Sie müssen sie umleiten, bevor Sie sie analysieren können.
  • und vielleicht noch etwas anderes.
Kamil Maciorowski
quelle
du hast recht :) fehlt. Also habe ich korrigiert: find -exec sh -c 'if [["$ (avconv -i {}") == " 720 "]; dann Echo 720 gefunden; fi; ' ')' nach {} "... aber das Ergebnis der Ausführung scheint den Inhalt der Dateien selbst zu lesen. Hinweis: Die Sterne * sind hier nicht sichtbar
Linuxwhisperer
... die andere Sache ist, ich habe nicht den Befehl 'ffprobe' in meinem Repo, oder ich kenne den Paketnamen (Sabayon) nicht
Linuxwhisperer
@Linuxwhisperer ffprobeist ffmpegin meinem Kubuntu. Ein ähnliches Werkzeug sollte funktionieren (Sie sollten es grepnatürlich an das Werkzeug anpassen ). Der Punkt ist, dass Sie dies nicht verwenden sollten, avconvda es die Ausgabedatei erfordert, die einen Fehler auslöst - zumindest in (K) Ubuntu.
Kamil Maciorowski
@Linuxwhisperer Sabayon basiert auf Gentoo, nicht wahr? Dann lies das hier .
Kamil Maciorowski
danke, aber wie alles, was ich lese und weiß, wird ffmpeg immer mehr durch avconv ersetzt. Ich habe virtual / ffmpeg-9-r2 auf meinem System installiert, aber ffprobe ist vermutlich kein Teil davon. Wie auch immer, könntest du mir einen Konstrukt-Build mit find oder für i ... und grep 720 schicken, pls?
Linuxwhisperer