Esegui il comando solo su determinati file nelle sottocartelle, a seconda di altri file


0

Ho una cartella chiamata Music, che contiene sottocartelle di artisti diversi, che contengono molti file .flac. Sto cercando di convertirli tutti nel formato di file .wav e poi convertirli in Apple alac, perché la conversione diretta non funziona correttamente, ma il trucco è che ne ho convertiti alcuni prima, ma non tutti .

La mia cartella è sostanzialmente così:

Musica / ArtistX / Song1.flac

Musik / ArtistX / Song1.m4a

Musik / ArtistX / Song2.flac

Musik / Artisty / Song1.flac

Musik / Artisty / Song1.m4a

Fondamentalmente voglio un comando che mi permetta di convertire solo i file .flac che non hanno un corrispondente file .m4a accanto a loro. In passato li ho semplicemente convertiti di nuovo eseguendo questo grezzo per loop:

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

Ma questo è molto inefficiente per la mia configurazione attuale.

PS: Se è possibile, preferirei usare ffmpeg.


Hai provato a usare find? Prova qualcosa del tipo "trova. -Name '* .flac' -exec ffmp -i {}> {}. Wav \;" Potrebbe essere più efficiente.
Lewis M,

Ciò porterebbe comunque una conversione indesiderata in .wav per i file che ho già convertito fino a .m4a
bastianplettner

Risposte:


0

Perché non cercare solo i file flac, controllare i file m4a esistenti e convertirli se non esiste alcun file m4a? Solo un piccolo esempio:

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

Questo non funziona perché ho spazi nei nomi dei miei file e directory, il comando sembra dividere la variabile $ {i} dopo ogni spazio
bastianplettner
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.