首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >更优雅地使用find来传递按目录分组的文件?

更优雅地使用find来传递按目录分组的文件?
EN

Stack Overflow用户
提问于 2013-02-17 22:34:04
回答 2查看 296关注 0票数 0

此脚本花费了我太长时间(!!)编译,但我终于有了一个相当不错的脚本,它可以做我想做的事情:

代码语言:javascript
复制
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已经在遍历目录了?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-02-18 01:57:03

我不能评论flac命令本身,但至于其他命令:

代码语言:javascript
复制
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
EN

Stack Overflow用户

发布于 2013-02-17 22:37:40

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

例如,如果您要在所有文件中查找text foo,您将得到如下内容

代码语言:javascript
复制
find . type f | xargs grep foo

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

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/14922169

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档