2013-02-17 2 views
0

Этот сценарий взял меня слишком долго (!!) для компиляции, но я наконец-то есть достаточно хороший скрипт, который делает то, что я хочу:Более элегантное использование поиска для передачи файлов, сгруппированных по каталогу?

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 уже перебирает каталоги?

ответ

0

Я не могу комментировать FLAC сами команды, но и для остальное:.

find . -name '*.flac' \ 
! -exec bash -c 'metaflac --list --block-type=VORBIS_COMMENT "$1" | grep -qi "REPLAYGAIN_ALBUM_PEAK"' -- {} \; \ 
    -execdir bash -c 'metaflac --add-replay-gain *.flac' \; 

Вы просто найти нужные файлы, а затем обработать каталог это в

+0

Я посмотрел на это, но он, похоже, не работал. Проблема в том, что '-execdir' работает так же, как' -exec', но запускает команду в каталоге каждого файла. Таким образом, это означает, что 'find' будет запускать эту команду для каждого найденного файла, а не только для каждого каталога. Разве вы ничего не знаете, я этого не делаю? –

+0

Мое предположение заключалось в том, что '--add-replay-gain' добавит этот REPLAYGAIN_ALBUM_PEAK, чтобы другие файлы в каталоге не совпадали. –

+0

Это хороший момент! Я думал, что это было немного расточительно проверять все файлы после применения тегов, но мой оригинальный скрипт делает это в любом случае в другом порядке. Спасибо =) –

1

Для этого вы можете использовать xargs.

Например, если вы ищете текст Foo во всех ваших файлов, вы будете иметь что-то вроде

find . type f | xargs grep foo 

xargs проходит каждый результат от левого конца выражения (найти) в команда invitated с правой стороны.

Тогда, если не существует команды для достижения того, что вы хотите сделать, вы всегда можете создать функцию, и передать, если xargs

+0

Похоже, мне нужно прочитать на xargs! Я не понимал, что он может принимать функции ... –