为什么我不能从 Linux 中的 find 命令中排除 2 个或更多模式?

为什么我不能从 Linux 中的 find 命令中排除 2 个或更多模式?

我尝试从 find 命令中排除.svg.jpg文件,但它仍然返回这两个文件。我做错了什么?

find . \( ! -iname \*\.svg -o ! -iname \*\.jpg \)

答案1

您的逻辑有缺陷:使用您现在拥有的命令,您可以找到每个非.svg或每个非.jpg文件。您写的内容如下:

查找(所有非 SVG或者所有非 JPG 格式的内容)

因此您将获得 JPG 文件,因为find已经评估了第一部分并为您提供了不是 SVG 文件的所有内容。由于选项的解析方式,如果表达式的第一部分or计算结果为真,则甚至不会查看第二部分。

本质上,一旦find返回非 SVG 的所有内容,它就不会关心您想要用 JPG 文件做什么。


正确的表述方式应该是合乎逻辑的and

find . \( ! -iname '*.svg' -a ! -iname '*.jpg' \)

内容如下:

查找(所有非 SVG所有非 JPG 格式的内容)

或者,通过否定整个表达式:

find . ! \(-iname '*.svg' -o -iname '*.jpg' \)

内容如下:

找到所有不是(SVG或者JPG)

*请注意,如果您只是将其放在单引号或双引号中,则可以跳过转义,例如-iname '*.jpg'。这更容易阅读。

相关内容