使用find -prune时输出被修剪目录名的问题求助
解决
find命令中-prune后仍输出目录名的问题 我之前也踩过这个坑!你遇到的问题核心在于find的表达式执行逻辑:-prune只是告诉find不要遍历匹配到的目录内容,但它本身是一个返回“真”的测试条件——如果你的命令没有明确控制输出逻辑,find会触发默认的-print动作,把这个匹配到的目录名打出来,哪怕你加了-type f。
问题出在哪?
假设你的原命令大概是这样的(tcsh下需要转义括号):
find . -name "work" -prune -o -type f
因为find默认会对所有匹配到的条件执行-print,当-name "work" -prune匹配到目录时,这个分支逻辑为真,所以find就直接打印了这个目录;而-type f只在前面的条件不满足时才会生效,所以你看不到work目录里的文件,但目录本身被输出了。
修正方案
你需要明确告诉find:只有符合-type f的项才需要打印,而被-prune的目录只修剪不输出。有两种常用写法:
写法1:分组控制输出逻辑
用转义括号把条件分组,明确只在文件分支执行-print:
find . \( -name "work" -prune \) -o \( -type f -print \)
这样-prune的分支只做修剪操作,不会触发打印;只有后面匹配-type f的文件才会被输出。
写法2:用-false让-prune分支不触发默认打印
在-prune后加-false,让这个分支的逻辑结果为假,从而跳过默认的-print:
find . -name "work" -prune -false -o -type f
这个写法更简洁,原理是-prune -false会让整个分支返回假,find就不会对这个目录执行默认打印了。
验证一下
执行修正后的命令,你会发现work目录不会再被输出,同时其他符合-type f的文件正常打印,work目录的内容也确实被-prune修剪掉了。
内容的提问来源于stack exchange,提问作者ocmob
相关产品推荐
相关产品推荐

