gpt4 book ai didi

bash - 如何理解 `find -prune` 的行为?

转载 作者:行者123 更新时间:2023-11-29 09:14:24 24 4
gpt4 key购买 nike

根据 GNU find 的联机帮助页,默认使用 -print 操作,

Actions which inhibit the default -print are -delete, -exec, -execdir, -ok, -okdir, -fls, -fprint, -fprintf, -ls, -print and -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

  1. file1 不满足 -name dir 所以跳过。

  2. dir 满足 -name dir 所以被修剪并且 dir 被添加到 TODO 列表。

  3. -print 额外应用于 TODO 列表中的 dir

#2

  1. file1 满足 -name file1 所以添加到 TODO 列表。

  2. #1-2

    相同
  3. -print 额外应用于 TODO 列表中的 dirfile1

#3

  1. #2-1

    相同
  2. #2-2

    相同
  3. -print 应用于 TODO 列表中的 file1

  4. -print 应该另外应用于 dir 因为 -prune 不抑制 -打印。 (但这是不正确的。为什么?)

#4

  1. file1 被添加到 TODO 列表。

  2. #3-2

    相同
  3. #3-3

    相同
  4. #3-4

    相同

(实际上 find 中没有 TODO 列表。参见 this commentthe standard 。)


补充:

正如 oguz ismail's answer 中指出的那样(现已删除),我的问题与-prune 无关。然而,问题并没有解决。

让我们想想-name A -o -name B -print。这分为两个表达式:-name A-name B -print

我的理解:第一个表达式 -name A 没有 Action 。所以 -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 (两个表达式永远不会同时满足)

最佳答案

写在this commentthis comment ,我的问题总结在 OP 的 Supplement 部分,来自 GNU find 联机帮助页中的歧义,POSIX 有更好的解释。我发现这是真的。

POSIX

(If no expression is present, -print shall be used as the expression. Otherwise,) if the given expression does not contain any of the primaries -exec, -ok, or -print, the given expression shall be effectively replaced by:

( given_expression ) -print

given_expression 很自然地解释为一个复合表达式,它由一个或多个子表达式组成,因为它被括在括号中。 (如果此 given_expression 引用单个子表达式,则括号肯定是多余的。)

关于bash - 如何理解 `find -prune` 的行为?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58542440/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com