Você tem esse código:
for file in *.mkv *avi *mp4 *flv *ogg *mov; do target="${file%.*}.mkv" ffmpeg -i "$file" "$target" && rm -rf "$file" done
que é executado no diretório atual. Para transformá-lo em um processo recursivo, você tem algumas opções. O mais fácil (IMO) é usar find
como você sugeriu. A sintaxe para find
é muito "un-UNIX-like", mas o princípio aqui é que cada argumento pode ser aplicado com as condições AND ou OR. Aqui, vamos dizer " Se este nome-de-arquivo corresponder a OU-que-nome do arquivo corresponde Então imprima-o ". Os padrões de nome de arquivo são citados para que o shell não possa obtê-los (lembre-se de que o shell é responsável por expandir todos os padrões não citados, portanto, se você tivesse um padrão sem aspas de *.mp4
e tivesse janeeyre.mp4
em seu diretório atual , o shell substituiria *.mp4
pela correspondência e find
veria -name janeeyre.mp4
em vez do desejado -name *.mp4
; fica pior se *.mp4
corresponder a vários nomes ...). Os colchetes são prefixados com \
também para evitar que o shell tente executá-los como marcadores de subshell (poderíamos citar os colchetes, se preferir: '('
).
find . \( -name '*.mkv' -o -name '*avi' -o -name '*mp4' -o -name '*flv' -o -name '*ogg' -o -name '*mov' \) -print
A saída disso precisa ser alimentada na entrada de um loop while
que processa cada arquivo por vez:
while IFS= read file ## IFS= prevents "read" stripping whitespace
do
target="${file%.*}.mkv"
ffmpeg -i "$file" "$target" && rm -rf "$file"
done
Agora, tudo o que resta é unir as duas partes com um pipe |
, de modo que a saída do find
se torne a entrada do loop while
.
Enquanto você está testando este código, eu recomendo que você prefixar tanto ffmpeg
quanto rm
com echo
para que você possa ver o que seria executado - e com quais caminhos.
Aqui está o resultado final, incluindo as declarações echo
que recomendo testar:
find . \( -name '*.mkv' -o -name '*avi' -o -name '*mp4' -o -name '*flv' -o -name '*ogg' -o -name '*mov' \) -print |
while IFS= read file ## IFS= prevents "read" stripping whitespace
do
target="${file%.*}.mkv"
echo ffmpeg -i "$file" "$target" && echo rm -rf "$file"
done