Script em lote do Windows para script Shell

Script em lote do Windows para script Shell

Tenho um script em lote do Windows que desejo executar no Linux, mas estou tendo problemas para convertê-lo em um script de shell

Eu me pergunto se alguém pode ajudar.

: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

Estou tentando convertê-lo para um script de shell, mas estou tendo problemas. Eu não sou muito bom nisso.

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

Não tenho certeza de como fazer o loop, por isso é verificado constantemente.

Responder1

Mais como (assumindo 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

Na prática:

  • Estava faltando uma doneinstrução indicando o loop
  • Seu {*.mkv,*/*.mkv,*/*/*.mkv,*/*/*/*.mkv}padrão, embora não esteja incorreto, fará com que o ffmpeg emita uma mensagem de erro para cada padrão que não corresponda. globstarjunto com **faz com que um único padrão funcione em níveis de diretório.
  • Adicionei um teste no final para apagar o .mkv somente se não houvesse erro na transcodificação para mp4.

informação relacionada