如何在查找中组合 2 个名称条件?

如何在查找中组合 2 个名称条件?

我想搜索不符合 2 个-name条件的文件。我可以这样做:

find /media/d/ -type f -size +50M ! -name "*deb" ! -name "*vmdk"

这将产生正确的结果,但我可以以某种方式用 OR 连接这两个条件吗?

答案1

是的你可以:

find /media/d/ -type f -size +50M ! \( -name "*deb" -o -name "*vmdk" \)

解释来自POSIX 规范:

表达: 否定初级;一元 NOT 运算符。

表达):如果表达式为真,则为真。

表达 -o 表达:初选交替;或运算符。如果第一个表达式为 true,则不应计算第二个表达式。

请注意,括号(无论是左括号还是右括号)都以反斜杠 ( \) 为前缀,以防止 shell 进行计算。

答案2

您也可以使用否定来做到这一点-regex:-

 find ./ ! -regex  '.*\(deb\|vmdk\)$'

答案3

您已经接近解决方案:

find /media/d/ -type f -size +50M -and ! -name "*deb" -and ! -name "*vmdk"

您可以按任意顺序组合以下逻辑运算符:

-a   -and      - operator AND
-o   -or       - operator OR
!              - operator NOT

答案4

您可以使用正则表达式,如下所示:

find /media/d -type f -size +50M ! -regex '\(.*deb\|.*vmdk\)'

反斜杠是转义字符;.匹配单个字符,并*用于匹配前一个字符零次或多次,因此.*意味着匹配零个或多个字符。

相关内容