Windows-Batchskript zu Shellskript

Windows-Batchskript zu Shellskript

Ich habe ein Windows-Batch-Skript, das ich unter Linux ausführen möchte, habe aber Probleme, es in ein Shell-Skript zu konvertieren

Ich frage mich, ob jemand helfen kann.

:start
for /r %%F in (*.mkv) do (
C:\Python27\Scripts\ffmpeg\bin\ffmpeg.exe  -y -i "%%F" -c:v libx264 -preset ultrafast -minrate 4.5M -maxrate 4.5M -bufsize 9M -c:a ac3 "%%~dpnF.mp4"
if not errorlevel 1 if exist "%%~dpnF.mp4" del /q "%%F"
)
TIMEOUT /T 60
goto start

Ich habe versucht, es in ein Shell-Skript umzuwandeln, aber ich habe Probleme. Ich bin nicht besonders gut darin.

for f in {*.mkv,*/*.mkv,*/*/*.mkv,*/*/*/*.mkv}; do 
ffmpeg -i "$f" -c:v libx264 -preset ultrafast -minrate 4.5M -maxrate 4.5M -bufsize 9M -c:a ac3 "${f%mkv}mp4";
rm "$f";

Ich bin nicht sicher, wie ich es in einer Schleife laufen lassen kann, daher wird es ständig geprüft.

Antwort1

Eher so (Bash vorausgesetzt):

shopt -s globstar
for f in **/*.mkv
do 
    ffmpeg -i "$f" -c:v libx264 -preset ultrafast -minrate 4.5M -maxrate 4.5M -bufsize 9M -c:a ac3 "${f%mkv}mp4";
    [[ $? -eq 0 ]] && rm "$f";
done

In der Praxis:

  • Ihnen fehlte eine doneAnweisung, die die Schleife angibt
  • Auch wenn Ihr {*.mkv,*/*.mkv,*/*/*.mkv,*/*/*/*.mkv}Muster nicht falsch ist, gibt ffmpeg für jedes nicht übereinstimmende Muster eine Fehlermeldung aus. globstarZusammen mit **sorgt es dafür, dass ein einzelnes Muster über alle Verzeichnisebenen hinweg funktioniert.
  • Ich habe am Ende einen Test hinzugefügt, um die MKV-Datei nur zu löschen, wenn beim Transkodieren in MP4 kein Fehler aufgetreten ist.

verwandte Informationen