如何使用find命令在每个目录仅匹配一个foo开头的文件?
用find命令在每个目录仅匹配一个目标文件
核心结论
标准find命令的原生参数无法直接实现“每个目录仅匹配一个文件”的需求,但可以通过find结合极简的shell逻辑达成目标,无需额外后处理脚本。
实现方法
如果要匹配所有以foo开头的文件,且每个目录只输出第一个匹配项,可执行以下命令:
find . -type d -exec sh -c ' for dir do # 在当前目录下查找第一个匹配的文件,找到即退出 target=$(find "$dir" -maxdepth 1 -type f -name "foo*" -print -quit) [ -n "$target" ] && echo "$target" done ' sh {} +
命令解释
- 外层
find . -type d:遍历当前目录下的所有子目录 -exec sh -c '...' sh {} +:将找到的目录批量传给shell脚本处理- 内层
find "$dir" -maxdepth 1 ... -quit:限制仅在当前目录查找,找到第一个匹配文件后立即终止,避免遍历其他文件 - 替换
foo*为你需要的匹配模式(比如foo_*、foo?.txt等)即可适配不同需求
效果验证
针对你给出的目录结构:
A/ ├─ foo_a1 ├─ foo_a2 ├─ foo_a3 C/ ├─ D/ │ ├─ B/ │ │ ├─ foo_b1 │ │ ├─ foo_b2 ├─ E/ │ ├─ foo_e1 │ ├─ foo_e2
执行命令后会输出类似结果(具体输出哪个文件取决于find的遍历顺序):
./A/foo_a1 ./C/D/B/foo_b1 ./C/E/foo_e1
补充说明
如果严格要求“仅使用find命令不调用任何外部程序”,则无法实现该需求——因为find本身没有内置的“每个目录终止匹配”的参数。但上述方法仅借助了系统内置的shell,属于轻量且常用的解决方案。
内容的提问来源于stack exchange,提问作者Proko
相关产品推荐
相关产品推荐

