Script por lotes de Windows a script de Shell

Script por lotes de Windows a script de Shell

Tengo un script por lotes de Windows que quiero ejecutar en Linux, pero tengo problemas para convertirlo a un script de shell.

Me pregunto si alguien puede ayudar.

: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

He intentado convertirlo a un script de shell, pero tengo problemas. No soy bueno en esto.

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";

No estoy seguro de cómo realizar un bucle, por lo que lo comprobo constantemente.

Respuesta1

Más bien (asumiendo bash):

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

En la práctica:

  • Te faltaba una donedeclaración que indicara el bucle.
  • Su {*.mkv,*/*.mkv,*/*/*.mkv,*/*/*/*.mkv}patrón, aunque no sea incorrecto, hará que ffmpeg emita un mensaje de error para cada patrón que no coincida. globstarjunto con **hace que un solo patrón funcione en todos los niveles de directorio.
  • Agregué una prueba al final para borrar el .mkv solo si no hubo ningún error al transcodificar a mp4.

información relacionada