![为什么明确添加 -print 时 find(1) 的行为会有所不同?](https://linux22.com/image/1457450/%E4%B8%BA%E4%BB%80%E4%B9%88%E6%98%8E%E7%A1%AE%E6%B7%BB%E5%8A%A0%20-print%20%E6%97%B6%20find(1)%20%E7%9A%84%E8%A1%8C%E4%B8%BA%E4%BC%9A%E6%9C%89%E6%89%80%E4%B8%8D%E5%90%8C%EF%BC%9F.png)
的手册页find(1)
显示:
如果表达式中不包含除 之外的操作
-prune
,
然而,这两种表达方式似乎还是有区别的:
$ find . -path '*fo*' -prune -o -type f -print
./bar/xzyzzy
$ find . -path '*fo*' -prune -o -type f
./foo
./bar/xzyzzy
为什么./foo
包含在后者的输出中?
我使用以下代码创建了上述示例目录树结构:
$ cd $(mktemp -d)
$ mkdir foo
$ mkdir bar
$ touch foo/quux
$ touch bar/xzyzzy
对于我来说,输出find --version
是:
find (GNU findutils) 4.4.2`
答案1
哦,我想我已经自己解决了……
在前一种情况下,-print
执行仅有的-path '*fo*'
当 的短路行为导致第一个条件 ( ) 不成立时-o
。
然而,在第二种情况下,隐式-print
操作在所有的-path '*fo*'
表达式为真 - 当为真时情况就是这样或者 -type f
是正确的。换句话说,我的问题中的两个命令相当于:
$ find . \( -path '*fo*' -prune \) -o \( -type f -print \)
./bar/xzyzzy
... 和:
$ find . \( -path '*fo*' -prune -o -type f \) -print
./foo
./bar/xzyzzy
无论如何,我认为:)