根据GNU的手册页find
,-print
行动默认使用和
抑制默认的操作
-delete
,-exec
,-execdir
,-ok
,-okdir
,-fls
,-fprint
,-fprintf
,-ls
,-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
修剪条件,dir
并添加到TODO列表中。
-print
还适用dir
于TODO列表。
#2
file1
满足,-name file1
因此已添加到TODO列表中。
与#1
-2相同
-print
另外施加到dir
与file1
在TODO列表。
#3
与#2
-1相同
与#2
-2相同
-print
应用于file1
TODO列表中。
-print
应该另外应用,dir
因为-prune
它不会抑制-print
。(但这是不正确的。为什么?)
#4
file1
已添加到TODO列表。
与#3
-2相同
与#3
-3相同
与#3
-4相同
(实际上,中没有TODO列表find
。请参阅此注释和标准。)
补充:
正如oguz ismail的答案(现已删除)中指出的那样,我的问题与无关-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
满足(两个表达式从不同时满足)
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句