括号

括号

我发现我输入的一些查找命令会忽略很多文件,并且只有在我不在命令末尾传递操作时才似乎可以正常工作*。

我将使用以下命令作为这个问题的基础:
find . -depth -name '*.elf' -or -name '*.exe'

真实例子:
find . -depth -name '*.elf' -or -name '*.exe' -or -name 'f*.xml' -or -name '*.html' -or -name '*.jar' -or -name '*.mat' -or -name '*.pyc' -or -name '*_dll' -or -name '*.class' -or -name '*.DS_Store' -or -name '*.dll' -or -name '*.dex'

基本命令本身提供了大量输出,但以下命令不执行任何操作*:
find . -depth -name '*.elf' -or -name '*.exe' -delete

同样,此命令虽然应与基本命令相同,但不提供输出*:
find . -depth -name '*.elf' -or -name '*.exe' -print

甚至*:
find . -depth -name '*.elf' -or -name '*.exe' -exec echo {} \;

我是否遗漏了有关 find 工作原理的信息?

我正在使用 GNU find 版本 4.8.0。

*通过“正常工作”,我的意思是如果我运行基本命令,我会发现全部匹配文件,但通过任何显式操作,只会找到一些一致的子集。这意味着如果我通过-delete,该子集将消失,并且没有显式操作将找到任何剩余文件。恢复到基本命令将再次找到它们。

答案1

括号

显然,动作成为或表达式的一部分,并且只对其中一个分支起作用,同时删除所有分支的隐式打印。(来源

那么解决方案就是编写如下表达式,其中包含 or 分支并确保该操作不仅仅应用于一个分支:
find . -depth \( -name '*.elf' -or -name '*.exe' -or -name 'f*.xml' -or -name '*.html' -or -name '*.jar' -or -name '*.mat' -or -name '*.pyc' -or -name '*_dll' -or -name '*.class' -or -name '*.DS_Store' -or -name '*.dll' -or -name '*.dex' \)

或者缩写形式:
find . -depth \( -name '*.elf' -or -name '*.exe' \)

我仍然发布这个问题(加上答案),因为在我写完问题之前我找不到正确的搜索词来找到答案。希望这个新问题会对某人有所帮助。

相关内容