Wie verwende ich den aktuellen Dateinamen mehrmals in einem Pipe-Befehl?

Wie verwende ich den aktuellen Dateinamen mehrmals in einem Pipe-Befehl?

Ich versuche, mehrere MOV-Dateien in MP4 zu konvertieren. Wie kann ich den Dateinamen aus der Pipe abrufen, um den FFMPEG-Befehl zu generieren? Wie kann ich das Pipe-Argument mehrfach in der Kettenverbindung verwenden? Ich versuche, so etwas zu haben:

 ls *.MOV | ffmpeg -y -i $file  "$file.mp4"

Antwort1

Pipes sind nützlich, wenn Sie dieStandardausgabeeines Befehls alsStandardeingabeeines anderen Befehls. Sie müssen jedoch eine Datei als Eingabe übergeben ffmpeg, nicht Dateinamen auf der Standardeingabe. Und Sie müssen es ffmpegmehrere Male ausführen, einmal für jede Eingabedatei, um eine Ausgabedatei zu erhalten.

Kurz gesagt, Pipes sind hierfür nicht nützlich, Sie benötigen eine Schleife, wie in der anderen Antwort vorgeschlagen. Die Dateinamenparameter sollten jedoch in doppelte Anführungszeichen gesetzt werden:

for file in *.MOV; do
    ffmpeg -y -i "$file" "$file.mp4"
done

Sie haben in einem Kommentar erwähnt, dass Sie ein Perl-Skript schreiben könnten. Das wäre wirklich übertrieben. Bash ist ein einfacherer, perfekt geeigneter Ansatz. Beachten Sie, dass Sie das obige Skript in einer einzigen Zeile schreiben und direkt auf der Befehlszeile ausführen könnten.

for file in *.MOV; do ffmpeg -y -i "$file" "$file.mp4"; done

Antwort2

Sie können dies mit einer einfachen forSchleife tun

#!/bin/bash

for file in /path/to/*.MOV
do

    echo "Converting $file"
done

verwandte Informationen