Этот сценарий взял меня слишком долго (!!) для компиляции, но я наконец-то есть достаточно хороший скрипт, который делает то, что я хочу:Более элегантное использование поиска для передачи файлов, сгруппированных по каталогу?
find "[email protected]" -type d -print0 | while IFS= read -r -d $'\0' dir; do
find "$dir" -iname '*.flac' -maxdepth 1 ! -exec bash -c '
metaflac --list --block-type=VORBIS_COMMENT "$0" 2>/dev/null | grep -i "REPLAYGAIN_ALBUM_PEAK" &>/dev/null
exit $?
' {} ';' -exec bash -c '
echo Adding ReplayGain tags to "$0"/\*.flac...
metaflac --add-replay-gain "${@:1}"
' "$dir" {} '+'
done
Цель состоит в том, чтобы найти файл дерева каталогов, содержащих файлы FLAC , проверьте, отсутствуют ли теги REPLAYGAIN_ALBUM_PEAK
, и сканируйте все файлы в этом каталоге для ReplayGain, если они отсутствуют.
Большой камнем преткновения является то, что все файлы FLAC для данного альбома должны быть переданы в метафлак в качестве одной команды, иначе метафлак не знает, что они все один альбом. Как вы можете видеть, я достиг этого, используя find ... -exec ... +
.
Что мне интересно, если есть более элегантный способ сделать это. В частности, как я могу пропустить цикл while
? Конечно, это должно быть ненужным, потому что find
уже перебирает каталоги?
Я посмотрел на это, но он, похоже, не работал. Проблема в том, что '-execdir' работает так же, как' -exec', но запускает команду в каталоге каждого файла. Таким образом, это означает, что 'find' будет запускать эту команду для каждого найденного файла, а не только для каждого каталога. Разве вы ничего не знаете, я этого не делаю? –
Мое предположение заключалось в том, что '--add-replay-gain' добавит этот REPLAYGAIN_ALBUM_PEAK, чтобы другие файлы в каталоге не совпадали. –
Это хороший момент! Я думал, что это было немного расточительно проверять все файлы после применения тегов, но мой оригинальный скрипт делает это в любом случае в другом порядке. Спасибо =) –