我尝试从 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'
。这更容易阅读。