Aqui está um verso simples que você pode digitar em um terminal:
find . -name "*.wav" -print0 | while read -d $'find . -name "*.wav" -print0 | while read -d $'while <something is true>; do
<run some commands>
done
' file; do ffmpeg -i "$file" -c:a libfdk_aac -vbr 3 output.m4a "${file%wav}m4a"; done
' file; do neroAacEnc -2pass -q 1 -if "$file" -of "${file%wav}m4a"; done
Você também pode usar o ffmpeg, como sugere o @slm,
find . -name "*.wav" -print0 | while read -d $'find . -name "*.wav" -print0 | while read -d $'while <something is true>; do
<run some commands>
done
' file; do ffmpeg -i "$file" -c:a libfdk_aac -vbr 3 output.m4a "${file%wav}m4a"; done
' file; do neroAacEnc -2pass -q 1 -if "$file" -of "${file%wav}m4a"; done
Não tenho certeza de como o neroAacEnc se compara ao ffmpeg, mas sei que o ffmpeg é avançado bastante popular entre muitos usuários do Linux.
Explicação
find é um programa que retorna caminhos para arquivos que correspondem a uma determinada propriedade de arquivo, neste caso, o nome do arquivo. Se tudo o que você queria saber era quais arquivos .wav estão em subdiretórios do caminho atual, você faria find . -name "*.wav" . Normalmente isso gera cada arquivo em uma nova linha. O -print0 separa as correspondências com um caractere nulo. Isso permite o tratamento adequado de nomes de arquivos com espaços quando passamos a saída para os próximos comandos.
O caractere | é conhecido como um pipe. Ele diz ao shell para obter a saída do comando à esquerda e passá-lo como entrada para o comando à direita, neste caso, o comando read dentro do loop while .
O comando read é usado para obter a saída de find e atribuí-la a uma variável, "file". Normalmente, isso designaria valores para "file" a cada palavra por vez, mas o -d $' faz com que as atribuições sejam delimitadas pelo caractere nulo (correspondendo como delimitamos os arquivos em find'$-print0 usando o read flag).
Os loops while fazem com que do atribua iterativamente valores a "file" para cada nome de arquivo correspondente. Os done e ffmpeg fazem parte da sintaxe bash padrão para um loop while:
Nesse caso, nosso "executar algum comando" é neroAacEnc ou $file . Em cada um dos casos, o arquivo de entrada (ou seja, read ) é especificado com a variável "file" que atribuímos com ${file%wav}w4a , e o arquivo de saída (ie, $file ) é uma manipulação dessa variável nos permite especificar um nome diferente para a saída. Normalmente, ${file} ou % avaliaria o nome do arquivo, digamos algum song.wav . O % diz para cortar da direita da variável qualquer sequência que coincida com os caracteres [1] para a direita do ${file%wav} (ou seja, "wav"). Então, % iria avaliar alguma música. , e então o "m4a" estaria lá para ser o novo final do nome do arquivo: alguma música.m4a .
[1] Eu digo "personagens" aqui por simplicidade. A sequência à direita do ${file%w*v} pode ser uma expressão regular. Por exemplo, se disséssemos %code% e a variável fosse algum song.w1234v , também seria avaliada para alguma música. .