Sua pergunta é, na verdade, Bash FAQ # 89 : basta adicionar </dev/null
para impedir que ffmpeg
leia o padrão entrada.
Eu tomei a liberdade de consertar seu script porque ele contém muitos erros potenciais. Alguns dos pontos importantes:
-
Os nomes dos arquivos são difíceis de manipular, porque a maioria dos sistemas de arquivos permite que eles contenham todos os tipos de caracteres não imprimíveis que as pessoas normais considerariam lixo. Fazer suposições simplificadoras como "nomes de arquivos contêm apenas caracteres 'normais'" tende a resultar em scripts de shell frágeis que aparecem para trabalhar em nomes de arquivos "normais" e quebram o dia em que são executados em um nome de arquivo particularmente desagradável que não segue as suposições do roteiro. Por outro lado, lidar corretamente com nomes de arquivos pode ser um incômodo que você pode achar que não vale a pena se a chance de encontrar um nome de arquivo estranho é próxima de zero (ou seja, você só usa o script em seus próprios arquivos e você dá seus próprios arquivos "simples" nomes). Às vezes, é possível evitar completamente essa decisão, não analisando os nomes dos arquivos. Felizmente, isso é possível com a opção
find(1)
-exec
. Basta colocar{}
no argumento para-exec
e você não precisa se preocupar com a análise defind
output. -
Usar o
sed
ou outros processos externos para fazer operações com cadeias de caracteres simples, como remover extensões e prefixos, é ineficiente. Em vez disso, use expansões de parâmetros que fazem parte do shell (nenhum processo externo significa que será mais rápido). Alguns artigos úteis sobre o assunto estão listados abaixo:- FAQ do Bash 73 : expansões de parâmetros
- FAQ 100 da Bash : manipulações de string
-
Use
$( )
e não use mais''
: FAQ da Bash 82 . -
Evite usar nomes de variáveis UPPERCASE. Esse namespace é geralmente reservado pelo shell para propósitos especiais (como
PATH
), então usá-lo para suas próprias variáveis é uma má idéia.
E agora, sem mais delongas, aqui está um roteiro limpo para você:
#!/bin/sh
logfile=encodemp4ize.log
echo "Started at $(date)." > "$logfile"
rsync -avz --exclude '*.flv' flvs/ mp4s/
find flvs/ -type f -name '*.flv' -exec sh -c '
for flvsfile; do
file=${flvsfile#flvs/}
< /dev/null ffmpeg -i "$flvsfile" -vcodec libx264 -vprofile high \
-preset slow -b:v 500k -maxrate 500k -bufsize 1000k \
-threads 0 -acodec libfaac -ab 128k \
"mp4s/${file%flv}"mp4
printf %s\n "$flvsfile MP4 done." >> "$logfile"
done
' _ {} +
Observação: usei POSIX sh
porque você não usou ou precisou de nenhum recurso bash
específico no original.