此脚本花费了我太长时间(!!)编译,但我终于有了一个相当不错的脚本,它可以做我想做的事情:
find "$@" -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文件必须作为一个命令传递给metaflac,否则metaflac不知道它们都是一个专辑。正如您所看到的,我已经使用find ... -exec ... +实现了这一点。
我想知道的是,是否有更优雅的方法来做到这一点。特别是,如何跳过while循环?这肯定是不必要的,因为find已经在遍历目录了?
发布于 2013-02-18 01:57:03
我不能评论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' \;您只需找到相关的文件,然后处理它所在的目录。
发布于 2013-02-17 22:37:40
您可能可以使用xargs来实现它。
例如,如果您要在所有文件中查找text foo,您将得到如下内容
find . type f | xargs grep fooxargs将左端表达式(find)中的每个结果传递给右端调用的命令。
然后,如果没有命令可以实现您想要做的事情,您可以随时创建一个函数,并将if传递给xargs
https://stackoverflow.com/questions/14922169
复制相似问题