Execute o comando apenas em determinados arquivos nas subpastas, dependendo de outros arquivos

0

Eu tenho uma pasta chamada Music, que tem subpastas de artistas diferentes, contendo um monte de arquivos .flac. Eu estou tentando converter todos eles para o formato de arquivo .wav e depois convertê-los para o Apple alac, porque a conversão direta não está funcionando corretamente, mas o problema é que eu convertei alguns deles antes, mas nem todos eles .

Minha pasta parece basicamente assim:

Music/ArtistX/Song1.flac

Musik/ArtistX/Song1.m4a

Musik/ArtistX/Song2.flac

Musik/ArtistY/Song1.flac

Musik/ArtistY/Song1.m4a

Basicamente eu quero um comando que me permita converter somente os arquivos .flac que não tenham um arquivo .m4a correspondente ao lado deles. No passado, eu simplesmente converti todos eles novamente executando esse loop 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.

P.S .: Se for possível, prefiro usar o ffmpeg.

    
por bastianplettner 24.09.2018 / 21:38

1 resposta

0

Por que não apenas procurar por arquivos flac, verificar arquivos m4a existentes e converter se não houver arquivos 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
    
por 24.09.2018 / 21:59