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

265
bastianplettner

У меня есть папка с именем 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" "$.wav"; done && for f in ./**/*.wav; do ffmpeg -n -i "$f" -acodec alac "$.m4a"; done && find . -type f -name '*.wav' -delete 

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

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

0
Вы пробовали использовать find? Попробуйте что-то вроде "find. -Name '* .flac' -exec ffmp -i {}> {}. Wav \;" Может быть более эффективным. Lewis M 5 лет назад 0
Это по-прежнему будет запускать нежелательное преобразование в .wav для файлов, которые я уже полностью преобразовал в .m4a bastianplettner 5 лет назад 0

1 ответ на вопрос

0
Frank Förster

Почему бы не просто выполнить поиск файлов 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 $)/$(basename $ .flac).m4a ] then # convert your file... File including path is in $ echo "Need to convert input file $ now..." WAV=$(dirname $)/$(basename $ .flac).wav M4A=$(dirname $)/$(basename $ .flac).m4a ffmpeg -i $ $ ffmpeg -n -i $ -acodec alac $ rm $ fi done 
Это не работает, потому что у меня есть пробелы в именах файлов и каталогов, команда, кажется, разделяет переменную $ после каждого пробела bastianplettner 5 лет назад 0

Похожие вопросы