bash - 如果找到匹配,则停止查找命令的递归
问题描述
使用 GNU findutils,我需要在目录树中搜索某个文件。如果已为给定分支找到文件,我想防止 find 进一步递归到分支中。假设我想找到文件 foo,这是我的目录树:
├── a
│ ├── a1
│ │ └── foo
│ └── foo
├── b
└── c
└── foo
鉴于我正在搜索上面的树,我想找到 a/foo 和 c/foo。但是,我不想找到 a/a1/foo,因为我已经在 a1 的父目录中找到了 foo。看来我应该在 find 命令中使用 -prune 标志,我找到了这个链接https://unix.stackexchange.com/questions/24557/how-do-i-stop-a-find-from-descending-into-例如found-directories,但我无法使其工作。我的尝试包括:
$ find -name foo -type f -prune
./a/a1/foo <- Unwanted hit
./a/foo
./c/foo
和
$ find -name foo -type f -prune -exec find ../foo -type f {} \;
find: paths must precede expression: ./a/a1/foo
Usage: find [-H] [-L] [-P] [-Olevel] [-D help|tree|search|stat|rates|opt|exec] [path...] [expression]
find: paths must precede expression: ./a/foo
Usage: find [-H] [-L] [-P] [-Olevel] [-D help|tree|search|stat|rates|opt|exec] [path...] [expression]
find: paths must precede expression: ./c/foo
Usage: find [-H] [-L] [-P] [-Olevel] [-D help|tree|search|stat|rates|opt|exec] [path...] [expression]
解决方案
这将打印包含 的目录foo
,并且不会在其子目录中递归:
find -type d -exec test -f {}/foo \; -print -prune
{}/foo
POSIX 明确未定义for 的行为:
如果实用程序名称或参数字符串包含两个字符“{}”,而不仅仅是两个字符“{}”,则由实现定义 find 是替换这两个字符还是直接使用字符串。
但可以按预期使用 GNU (并且您使用gnu-findutilsfind
标记了问题)。正如 Kamil Cuk 在评论中正确建议的那样,如果您使用的是非 GNU或想要更便携的解决方案,请使用:find
find -type d -exec sh -c 'test -f "$1"/foo' -- {} \; -print -prune
推荐阅读
- excel - Excel - 从多个范围过滤行
- elasticsearch - Elasticsearch - 计算子范围聚合
- javascript - 在 Postman 中将字段添加到 json
- vue.js - V-for="项目中的项目"。在计算属性中使用“项目”
- android - 如何测试共享偏好
- ajax - 未捕获的类型错误:无法设置未定义的属性“scriptsFailed”
- linux - 连接 SSH 并与另一个用户执行脚本
- php - mPDF 5.3 - base64 时图像显示为损坏的 [x]
- c++ - cpp 文件中的 C++ 变量能否定义为特殊符号 β
- string - 从已知索引中查找子字符串的索引