Der Martin: Syntax von GNU find und andere shell-Kniffe

Hallo alle miteinander,

seit ich mich vor einigen Monaten mal etwas näher mit ffmpeg befasst habe, hab ich dieses Tool schätzen und lieben gelernt, auch wenn es aufgrund der Vielzahl an Möglichkeiten nicht ganz einfach zu handhaben ist.

Nun wollte ich eine größere Zahl von Videodateien (einige 100) abgrasen, zunächst mal nur um Metadaten auszulesen. Dafür bietet sich das GNU-Tool find an, das für mich auch noch ein bisschen ... naja, sagen wir, ich hab's wegen der Fülle an Möglichkeiten auch noch nicht so ganz im Griff.

Um mit find eine größere Zahl von Dateien zu finden und zu bearbeiten, kann ich -type f, ein Dateinamen-Suchmuster (z.B. *.mp4) und die Option -exec verwenden.
Aber alle Hilfeseiten und Tutorials zu find, die ich bisher gefunden habe (Beispiel, Beispiel, Beispiel), ergänzen ihre Beispiele zu -exec still und heimlich mit einem Semikolon am Zeilenende, oder sogar mit der Sequenz \;, ohne zu erklären, wozu das gut ist oder was es bewirkt.

Kann da einer von den shell-Profis mal Licht ins Dunkel bringen? Ist das ein besonderes Schmankerl von find oder ein allgemeiner shell-Kniff, den ich noch nicht kenne?

Oh, und noch eine Frage zu ffmpeg. Rufe ich das Tool auf ...

ffmpeg -hide_banner -i video.mp4

... dann bekomme ich in knapper Form den technischen Steckbrief der Videodatei angezeigt (Spieldauer, enthaltene Streams, verwendete Codecs, Bitrate etc). Leider gibt ffmpeg diese Daten nicht an stdout aus, sondern an stderr. Das kann ich zwar mit 2> in eine Datei umleiten, aber nicht an ein anderes Programm pipen, um die Ausgabe zu parsen. Oder doch? Wenn ja, wie?

So long,
 Martin

--
Computer müssen weiblich sein: Eigensinnig, schwer zu durchschauen, immer für Überraschungen gut - aber man möchte sie nicht missen.
  1. Hello,

    ☆huhu☆

    da sind sie wieder, die Gedächtnislücken. Nur schon mal soviel: bei mehreren Hundert geht das leider nicht so direkt mit find, weil dessen argumentliste nicht groß genug ist. Da muss man 'was bauen mit xargs. Leider ist da die Synapsenlücke ;-O

    Ich bin mir aber fast sicher, dass wir das hier schon mal diskutiert haben und die Lösung folglich im Archiv steckt.

    Glück Auf
    Tom vom Berg

    --
    Es gibt nichts Gutes, außer man tut es!
    Das Leben selbst ist der Sinn.
    1. Hallo Tom,

      da sind sie wieder, die Gedächtnislücken.

      ja, kenn ich. ;-)

      Nur schon mal soviel: bei mehreren Hundert geht das leider nicht so direkt mit find, weil dessen argumentliste nicht groß genug ist. Da muss man 'was bauen mit xargs.

      Ich habe die Beschreibungen genau umgekehrt verstanden: Die Variante mit xargs sammelt die Argumente auf und verfüttert sie als großen Block, während -exec für jedes Argument eine Instanz des angegebenen Programms mit je einem Argument aufruft.

      Da ffmpeg sowieso nicht sinnvoll arbeiten kann, wenn man mehrere Eingabedateien auf einmal angibt (nicht zu vergessen den Schalter -i davor), kommt hier AFAIS nur die -exec-Variante in Frage.

      Ich bin mir aber fast sicher, dass wir das hier schon mal diskutiert haben und die Lösung folglich im Archiv steckt.

      Hmm. Dann geh ich da mal suchen, danke.

      Ciao,
       Martin

      --
      Computer müssen weiblich sein: Eigensinnig, schwer zu durchschauen, immer für Überraschungen gut - aber man möchte sie nicht missen.
      1. Hello,

        zu find -exec fand ich noch etwas bei Stackoverflow

        Anstelle von grep must Du dann eben dein Tool einsetzen.

        Glück Auf
        Tom vom Berg

        --
        Es gibt nichts Gutes, außer man tut es!
        Das Leben selbst ist der Sinn.
  2. Hi,

    ergänzen ihre Beispiele zu -exec still und heimlich mit einem Semikolon am Zeilenende, oder sogar mit der Sequenz \;, ohne zu erklären, wozu das gut ist oder was es bewirkt.

    es beendet das bei exec auszuführende Kommando.

    Leider gibt ffmpeg diese Daten nicht an stdout aus, sondern an stderr. Das kann ich zwar mit 2> in eine Datei umleiten, aber nicht an ein anderes Programm pipen, um die Ausgabe zu parsen. Oder doch?

    Stderr auf stdout umleiten: 2>&1

    cu,
    Andreas a/k/a MudGuard

    1. Hallo Andreas,

      ergänzen ihre Beispiele zu -exec still und heimlich mit einem Semikolon am Zeilenende, oder sogar mit der Sequenz \;, ohne zu erklären, wozu das gut ist oder was es bewirkt.

      es beendet das bei exec auszuführende Kommando.

      so dass man theoretisch noch weitere Parameter, z.B. ein zweites -exec anhängen könnte?

      Leider gibt ffmpeg diese Daten nicht an stdout aus, sondern an stderr. Das kann ich zwar mit 2> in eine Datei umleiten, aber nicht an ein anderes Programm pipen, um die Ausgabe zu parsen. Oder doch?

      Stderr auf stdout umleiten: 2>&1

      Das kannte ich tatsächlich noch nicht, danke!

      Ciao,
       Martin

      --
      Computer müssen weiblich sein: Eigensinnig, schwer zu durchschauen, immer für Überraschungen gut - aber man möchte sie nicht missen.