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