Executar comando apenas em determinados arquivos em subpastas, dependendo de outros arquivos


0

Eu tenho uma pasta chamada Música, que tem subpastas de artistas diferentes, contendo muitos arquivos .flac. Estou tentando converter todos eles para o formato de arquivo .wav e depois para o Apple alac, porque a conversão direta não está funcionando corretamente, mas o problema é que eu já converti alguns deles antes, mas nem todos .

Minha pasta é basicamente assim:

Música / ArtistaX / Song1.flac

Música / ArtistaX / Canção1.m4a

Música / ArtistaX / Song2.flac

Música / ArtistaY / Song1.flac

Música / ArtistaY / Song1.m4a

Basicamente, quero um comando que permita converter apenas os arquivos .flac que não possuem um arquivo .m4a correspondente ao lado deles. No passado, eu simplesmente converti todos eles novamente executando este loop for bruto:

for f in ./**/*.flac; do ffmpeg -i "$f" "${f%.*}.wav"; done && for f in ./**/*.wav; do ffmpeg -n -i "$f" -acodec alac "${f%.*}.m4a"; done && find . -type f -name '*.wav' -delete

Mas isso é muito ineficiente para minha configuração atual.

PS: Se for possível, eu preferiria usar o ffmpeg.


Você já tentou usar o find? Tente algo como "find. -Name '* .flac' -exec ffmp -i {}> {}. Wav \;" Pode ser mais eficiente.
Lewis M

Isso ainda seria executado conversão indesejada para .wav para arquivos que eu já convertidos todo o caminho para m4a
bastianplettner

Respostas:


0

Por que não procurar apenas arquivos flac, verificar arquivos m4a existentes e converter se não houver arquivo m4a? Apenas um pequeno exemplo:

for i in $(find $PWD -name "*.flac")
do
    # check if file was already converted and therefore a m4a file exists
    if [ ! -e $(dirname ${i})/$(basename ${i} .flac).m4a ]
    then
       # convert your file... File including path is in ${i}
       echo "Need to convert input file ${i} now..."
       WAV=$(dirname ${i})/$(basename ${i} .flac).wav
       M4A=$(dirname ${i})/$(basename ${i} .flac).m4a
       ffmpeg -i ${i} ${WAV}
       ffmpeg -n -i ${WAV} -acodec alac ${M4A}
       rm ${WAV}
    fi
done

Isso não funciona porque eu tenho espaços em meus nomes de arquivos e diretórios, o comando parece dividir a variável $ {i} depois de cada espaço
bastianplettner
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.