理解 find 命令中的运算符

理解 find 命令中的运算符
[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]$

我试图了解逻辑运算符在查找中的工作原理以及它如何影响修剪。

  1. 首先查找命令。

它将被视为“ 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 subexpression2subexpression1 -a subexpression2subexpression1subexpression2不是进行评估。这意味着

-true -o -print

不求值,-print因为仅此一点-true就足以说明整个代码片段求值为真。同样

-false -a -print

没有评估,-print因为仅仅-false足以告诉整个代码片段评估为假。

后者的行为非常直观。例如,当为假时,find . -name foo -print你不想。意识到这是一般规则的直接结果,其中不评估是否没有必要。不要只将其视为查找或打印某些内容的工具。将其视为一种工具find-print-name foosubexpression1 -a subexpression2subexpression2find评估给定的表达式。然后,就会很容易(或至少更容易)地理解其行为-true -o -print并将其视为-exec自定义测试(这很棒,您几乎可以测试任何东西;例子)。

我写过一个相当全面的答案关于如何find工作。不幸的是,这个问题没有引起太多关注,所以答案本身也没有引起太多关注。但也许你会发现它很有用。

相关内容