为什么明确添加 -print 时 find(1) 的行为会有所不同?

为什么明确添加 -print 时 find(1) 的行为会有所不同?

的手册页find(1)显示:

如果表达式中不包含除 之外的操作-prune-print则对表达式为真的所有文件执行该操作。

然而,这两种表达方式似乎还是有区别的:

$ 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

无论如何,我认为:)

相关内容