Habilite a globalização recursiva para recorrer aos subdiretórios:
shopt -s globstar
Então você poderia fazer:
for f in **/*.m4a
do
printf 'ffmpeg -i %q -c:a copy %q\n' "$PWD/$f" "$PWD/${f%.m4a}.mkv"
done > bulk.command.txt
printf
' %q
cita cadeias de caracteres para que possam ser usadas com segurança como entrada de shell, para que você não precise mexer nas cotações:
%q quote the argument in a way that can be reused as shell input
Se você criar um script, poderá usar argumentos para decidir se deve usar um diretório diferente para os arquivos de saída:
#! /bin/bash
shopt -s globstar
for f in **/*.m4a
do
printf 'ffmpeg -i %q -c:a copy %q\n' "$PWD/$f" "${1:-$PWD}/${f%.m4a}.mkv"
done > bulk.command.txt
${foo:-bar}
usa o valor da variável foo
, se não estiver vazio, ou bar
caso contrário, então, neste caso, ele usa o primeiro argumento se não estiver vazio e $PWD
caso contrário.
Você precisará recriar a estrutura de diretórios nesse caso, o que pode ser feito com mkdir -p
:
#! /bin/bash
shopt -s globstar
for f in **/*.m4a
do
printf 'mkdir -p %q\n' "${1:-$PWD}/${f%/*}"
printf 'ffmpeg -i %q -c:a copy %q\n' "$PWD/$f" "${1:-$PWD}/${f%.m4a}.mkv"
done > bulk.command.txt
Isso se você realmente precisar criar um script para uso posterior. Pessoalmente, eu não vejo o ponto - você pode apenas executar o loop diretamente quando você realmente precisa executá-lo:
#! /bin/bash
shopt -s globstar
for f in **/*.m4a
do
mkdir -p "${1:-$PWD}/${f%/*}"
ffmpeg -i "$PWD/$f" -c:a copy "${1:-$PWD}/${f%.m4a}.mkv"
done > bulk.command.txt