A expressão de backticked: echo {} | tr mkv m4v (que é não o que você deseja, por uma variedade de razões; veja abaixo) é expandida uma vez, quando o comando find é analisado. Se você estiver usando bash , normalmente ele será expandido para {} :
$ echo {} | tr mkv m4v
{}
E, de fato, isso acontece em todos os shell instalados na minha máquina, exceto peixes, que geram uma linha vazia. Supondo que você não esteja usando fish , os argumentos que find está realmente vendo serão:
find -name '*.mkv' -exec HandBrakeCLI -Z "Android Tablet" \
-c "1-3" -m -O --x264-tune film -E copy --decomb -s 1 -i {} \
-o {} \;
Em suma, HandBrakeCLI está recebendo o mesmo arquivo para entrada e saída, e acho que é isso que você está vendo, embora sua descrição dos sintomas não seja muito precisa.
Infelizmente, não há uma maneira fácil de encontrar o substituto de extensão que você deseja fazer em uma ação -exec . Você pode fazer isso passando o comando para bash -c , mas isso envolverá uma citação extra e confusa na linha de comando. Uma solução mais limpa e mais legível é criar um arquivo de script de shell que pode iterar seus argumentos:
Arquivo: mkvtom4v.sh (certifique-se de chmod a+x mkvtom4v.sh )
#!/bin/bash
for file in "$@"; do
HandBrakeCLI -Z "Android Tablet" -c "1-3" -m -O \
--x264-tune film -E copy --decomb -s 1 \
-i "$file" -o "${file/%.mkv/.m4v}"
done
E, em seguida, invoque-o com find:
find /path/to/directory -name '*.mkv' -exec /path/to/mkvtom4v.sh {} +
Algumas notas:
-
Não use backticks (
); eles foram preteridos por muitos anos. Usesome command$(some command), que é mais legível e permite o aninhamento. -
trdefinitivamente não é o que você deseja. Faz a tradução de caractere por caractere. Por exemplo,tr aeiou AEIOUfaria todas as vWs UppErcAsE.tr mkv m4vmudará todos oskpara4. Vejaman tr(ouinfo tr) para mais detalhes. -
"${file/%.mkv/.m4v}"é a sintaxe de pesquisa e substituição idiossincrática do bash. Nesse caso, significa: "Pegue o valor de$filee, se ele terminar com.mkv(o%significa" termina com "neste contexto), substitua-o por.m4v". Existem muitos outros bashisms para editar o valor de uma variável.man bashe procure por "Expansão de Parâmetros". -
Com o GNU find, você pode usar
{} +no final de um comando-exec(em vez de\;). Ele será substituído pelo maior número possível de nomes de arquivos encontrados. Vejainfo findpara mais detalhes.