如何用Unix find命令仅遍历指定分支下的dir3目录
优化find命令仅扫描指定目录的方案
原命令效率低的核心原因是:find会遍历/top-level下所有子目录,包括dir1、dir2等无关目录,每个文件都要匹配-path规则,完全没有提前跳过不必要的目录层级。
方案一:直接让Shell展开目标目录(推荐,效率最高)
利用Shell的路径通配符,直接生成所有目标dir3目录的路径,让find只在这些目录内搜索:
find /top-level/[0-9]*/dir3 -type f -name '*.log' -mtime +1 -print
- 原理:Shell会先将
/top-level/[0-9]*/dir3展开为所有符合条件的目录(比如/top-level/1/dir3、/top-level/2/dir3...),find只需要在这些目录下递归查找文件,完全不会进入dir1、dir2等无关目录,性能最优。 - 注意:如果编号目录数量极多(超过Shell参数列表上限),可能会触发
argument list too long错误,此时用方案二。
方案二:用-prune跳过无关目录
通过-prune参数提前排除不需要遍历的目录,避免find进入无关路径:
find /top-level -type d \( ! -path '/top-level/[0-9]*' -o -path '/top-level/[0-9]*' ! -path '/top-level/[0-9]*/dir3' \) -prune -o -type f -path '/top-level/[0-9]*/dir3/*.log' -mtime +1 -print
- 逻辑拆解:
- 匹配需要跳过的目录:
! -path '/top-level/[0-9]*':匹配/top-level下非编号开头的目录(比如/top-level/xx)-path '/top-level/[0-9]*' ! -path '/top-level/[0-9]*/dir3':匹配编号目录下非dir3的子目录(比如/top-level/1/dir1、/top-level/2/dir2)
- 对上述目录执行
-prune,即跳过遍历其内部内容 -o(逻辑或)之后的部分:匹配编号目录下dir3中的.log文件,满足修改时间条件则打印
- 匹配需要跳过的目录:
内容的提问来源于stack exchange,提问作者rotor155
相关产品推荐
相关产品推荐

