调换find命令子表达式顺序后目录修剪行为不符预期的疑问
问题解析:为什么调换find表达式顺序结果一致?
先明确你的文件结构:
./a.txt ./b.txt ./dir1/c.txt ./dir1/d.txt
核心原因:-prune的触发时机阻断了目录遍历
你忽略的关键点是:find是按目录树从上到下遍历的,当处理到./dir1这个目录本身时,第二个命令的表达式会触发-prune,直接跳过该目录下所有内容的遍历,导致dir1下的.txt文件根本不会被-name "*.txt"检查到。
拆解两个命令的执行逻辑
第一个命令:find . -path './dir1' -prune -o -name "*.txt"
执行流程:
- 遍历到
./dir1:匹配-path './dir1',执行-prune(停止遍历该目录下的内容),由于表达式返回true,触发默认的-print,输出./dir1。 - 遍历到
./a.txt/./b.txt:不匹配-path './dir1',进入-o后的分支,匹配-name "*.txt",返回true,触发-print,输出这两个文件。 dir1下的文件:因为./dir1被-prune,根本不会被遍历到,所以不会被处理。
第二个命令:find . -name "*.txt" -o -path './dir1' -prune
执行流程:
- 遍历到
./a.txt/./b.txt:匹配-name "*.txt",返回true,触发-print,输出这两个文件。 - 遍历到
./dir1:不匹配-name "*.txt",进入-o后的分支,匹配-path './dir1',执行-prune(停止遍历该目录下的内容),表达式返回true,触发-print,输出./dir1。 dir1下的文件:同样因为./dir1被-prune,不会被遍历到,自然不会被-name "*.txt"检查到,所以不会输出。
如何实现你的预期(输出所有.txt文件)
如果想要包含dir1下的.txt,需要避免对./dir1执行-prune,直接去掉-prune相关的部分即可:
find . -name "*.txt"
内容的提问来源于stack exchange,提问作者nabik
相关产品推荐
相关产品推荐

