0

这个脚本花了我太长时间(!!)来编译,但我终于有了一个相当不错的脚本,它可以满足我的需求:

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已经在遍历目录?

4

2 回答 2

1

您可能可以使用xargs来实现它。

例如,如果您在所有文件中查找文本foo,您将拥有类似

find . type f | xargs grep foo

xargs将每个结果从左端表达式 ( find ) 传递到右端调用的命令。

然后,如果不存在命令来实现您想要做的事情,您可以随时创建一个函数,并将 if 传递给xargs

于 2013-02-17T14:37:40.093 回答
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' \;

您只需找到相关文件,然后处理它所在的目录。

于 2013-02-17T17:57:03.417 回答