当应用另一个“-or”测试时,为什么 GNU 会发现抑制打印 -prune'd 目录?

当应用另一个“-or”测试时,为什么 GNU 会发现抑制打印 -prune'd 目录?

我有一个包含以下文件和.git目录的目录,例如

.
├── .git
│   ├── branches
│   ├── COMMIT_EDITMSG
│   ├── packed-refs
│   └── refs
├── readme.md
├── server_build.sh
└── tags

如果我find通过测试运行 GNU 命令-prunefind则会打印 'd 的目录prune

% find . -name '.git' -prune
./.git

如果添加另一个 OR 选项,则被修剪的目录不再出现在输出中:

% find . -name '.git' -prune -o -name '*.md' -print
./readme.md

在这种情况下,-name '.git'-name '*.md'测试都必须返回 true,添加另一个 OR 测试不可能突然使测试-name '.git' -prune不真实。
第一个语句中是否添加了一些隐式 switch?
换句话说就是找到转弯

find . -name '.git' -prune

进入

find . -name '.git' -prune -print

在运行时?-print当添加下一个测试时,隐式被取消?当应用另一个“-or”测试时,
为什么不打印 -pruned 目录?find

答案1

find . -name '.git' -prune

是相同的

find . -name '.git' -prune -print

所以它会修剪然后打印

find . -name '.git' -prune -o -name '*.md' -print

是相同的

find . \( -name '.git' -prune -true \) -o \( -name '*.md' -print \)

所以它执行第一个子句,如果它执行修剪,那么它执行 true (修剪返回 true),并且不执行右侧-o

这些将始终打印

find . \( -name '.git' -prune -o -name '*.md' \) -print
find . -name '.git' -prune -print -o -name '*.md' -print

相关内容