Запускайте команду только для определенных файлов в подпапках, в зависимости от других файлов
У меня есть папка с названием 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