find
的man手册,默认情况下使用-print
操作。阻止默认
-print
的操作包括-delete
、-exec
、-execdir
、-ok
、-okdir
、-fls
、-fprint
、-fprintf
、-ls
、-print
和-printf
。因此,
-prune
操作仍应意味着-print
操作。实际上,确实如此。
$ tree .
.
├── dir/
│ └── file2
└── file1
$ find . -name dir #0
./dir
$ find . -name dir -prune #1
./dir #printed as expected
$ find . -name dir -prune -or -name file1 #2
./file1
./dir #printed as expected
然而,有时候
-prune
会阻止默认的-print
。$ find . -name dir -prune -or -name file1 -print #3 #last -print is only added to the above example
./file1
$ find . -name dir -prune -or -print #4
.
./file1
我该如何理解这个矛盾?
我的理解:
#1
file1
不符合-name dir
的条件,因此被跳过。dir
符合-name dir
的条件,因此被剪枝并添加到待办列表中。在待办列表中,
-print
还被额外应用于dir
。
#2
file1
符合-name file1
的条件,因此被添加到待办列表中。与
#1
-2 相同在待办列表中,
-print
还被额外应用于dir
和file1
。
#3
与
#2
-1 相同与
#2
-2 相同-print
应用于 TODO 列表中的file1
。-prune
不会阻止-print
,因此还应该将其应用于dir
。(但这是不正确的。为什么?)
#4
将
file1
添加到 TODO 列表中。与
#3
-2 相同与
#3
-3 相同与
#3
-4 相同
find
中没有TODO列表。请参见此评论和标准。)
补充说明:
正如 oguz ismail's answer(现已删除)所指出的,我的问题与 -prune
无关。然而,这个问题还没有解决。
让我们考虑 -name A -o -name B -print
。这可以分为两个表达式:-name A
或者 -name B -print
。
我的理解:第一个表达式 -name A
没有动作。因此应该暗示使用 -print
。换句话说,-name A -o -name B -print
应该被解释为 -name A -print -o -name B -print
。
实际行为: -name A -o -name B -print
是一个复合表达式。在这个复合表达式中已经有了 -print
。因此不应该再暗示使用额外的 -print
。
-name A
或-name B -print
(两个表达式从不同时满足)。