Problema com o ffmpeg no loop do bash

2

Ao executar a seguinte linha de comando para converter vários arquivos .mkv em arquivos .mp4, as coisas dão errado. É como se o script tentasse executar todos os comandos de uma vez ou eles se enredassem de alguma forma, e a saída fica confusa. Eu não sei exatamente. Quando eu corri isso agora, apenas o primeiro arquivo foi convertido. Outras vezes, parece que tenho resultados inesperados ou aleatórios.

ls -1 *.mkv | while read f; do ffmpeg -i "$f" -codec copy "${f%.*}.mp4"; done

No entanto, se eu fizer o seguinte, as coisas funcionam conforme o esperado:

ls -1 *.mkv | while read f; do echo ffmpeg -i \"$f\" -codec copy \"${f%.*}.mp4\"; done > script; bash script

Mas por quê? O que é isso com ffmpeg ? Isso não acontece com loops bash e outros comandos além de ffmpeg . Eu gostaria de fazer isso de uma maneira simples, sem vazar aspas, canalizar para um arquivo de script, etc.

    
por forthrin 07.11.2015 / 21:59

1 resposta

4

ffmpeg também lê a entrada padrão, consumindo dados destinados a read . Redirecione sua entrada de /dev/null :

... | while read f; do ffmpeg -i "$f" -codec copy "${f%.*}.mp4" < /dev/null; done

Dito isso, não leia a saída de ls desta forma. Um loop for simples será suficiente (e removerá o problema original).

for f in *.mkv; do
    ffmpeg -i "$f" -codec copy "${f%.*}.mp4"
done
    
por 09.11.2015 / 02:59

Tags