[kony@HOSTNAME testing]$ pwd
/apps/kony/fmw/testing
[kony@HOSTNAME testing]$ touch SCCS
[kony@HOSTNAME testing]$ touch NOT_SCCS
[kony@HOSTNAME testing]$
[kony@HOSTNAME testing]$ find . -name SCCS -prune -o -print
.
./NOT_SCCS
[kony@HOSTNAME testing]$
[kony@HOSTNAME testing]$
我试图了解逻辑运算符在查找中的工作原理以及它如何影响修剪。
- 首先查找命令。
它将被视为“ find . -name SCCS -and -prune -o -print
”。(名称和 -prune 操作之间的隐式 -and 操作。)
对于当前目录中的每个文件和目录,将首先检查“-name SCCS”条件。如果 name 与 SCCS 匹配,则条件为 true 。由于第一个条件为 true 并且提到了“-and”,因此将检查下一个条件。下一个条件是“-prune”,它将被评估为 true 。所以它会像“ find . true -and true -o -print
”一样,意思find . true -o -print
是“ ”。由于左边的条件为 true 并且有 -or 操作,因此将评估下一个条件,即 -print。这意味着它应该打印名为 SCCS 的文件。那么为什么它没有打印呢?我理解错了吗。
答案1
我是不是理解错了?
你是。
注:正式POSIXfind
不定义true
为操作数。GNUfind
理解-true
(以破折号开头)和-false
。我将使用这些形式。但我明白你的意思true
。
我认为你的逻辑是正确的(包括) 。你忽略了一个事实,即像或这样find . -true -o -print
的表达式首先求值,如果它的结果足以说明整个表达式的结果,那么将subexpression1 -o subexpression2
subexpression1 -a subexpression2
subexpression1
subexpression2
不是进行评估。这意味着
-true -o -print
不求值,-print
因为仅此一点-true
就足以说明整个代码片段求值为真。同样
-false -a -print
没有评估,-print
因为仅仅-false
足以告诉整个代码片段评估为假。
后者的行为非常直观。例如,当为假时,find . -name foo -print
你不想。意识到这是一般规则的直接结果,其中不评估是否没有必要。不要只将其视为查找或打印某些内容的工具。将其视为一种工具find
-print
-name foo
subexpression1 -a subexpression2
subexpression2
find
评估给定的表达式。然后,就会很容易(或至少更容易)地理解其行为-true -o -print
并将其视为-exec
自定义测试(这很棒,您几乎可以测试任何东西;例子)。
我写过一个相当全面的答案关于如何find
工作。不幸的是,这个问题没有引起太多关注,所以答案本身也没有引起太多关注。但也许你会发现它很有用。