Запускайте команду только для определенных файлов в подпапках, в зависимости от других файлов

У меня есть папка с названием Music, в которой есть подпапки разных исполнителей, содержащие множество файлов.flac. Я пытаюсь преобразовать все из них в формат файла.wav, а затем преобразовать их в Apple Alac, потому что прямое преобразование не работает правильно, но суть в том, что я преобразовал некоторые из них раньше, но не все из них,

Моя папка выглядит в основном так:

Музыка / ArtistX / Song1.flac

Musik / ArtistX / Song1.m4a

Musik / ArtistX / Song2.flac

Musik / Артисты / Song1.flac

Musik / Артисты / Song1.m4a

В основном я хочу команду, которая позволяет мне преобразовывать только файлы.flac, у которых нет соответствующего файла.m4a рядом с ними. В прошлом я просто снова конвертировал их все, запустив этот сырой цикл for:

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

Но это очень неэффективно для моей текущей настройки.

PS: если это вообще возможно, я бы предпочел использовать ffmpeg.

1 ответ

Почему бы не просто выполнить поиск файлов flac, проверить существующие файлы m4a и выполнить преобразование, если файл m4a не существует? Просто маленький пример:

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
Другие вопросы по тегам