如何在查找中组合 2 -name 条件?

Pat*_*ryk 139 shell bash find

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

find /media/d/ -type f -size +50M ! -name "*deb" ! -name "*vmdk"
Run Code Online (Sandbox Code Playgroud)

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

Ser*_*rge 211

是的你可以:

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

来自POSIX 规范的解释:

表达式: 一个主要的否定;一元 NOT 运算符。

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

表达式 -o 表达式:原色的交替;OR 运算符。如果第一个表达式为真,则不应计算第二个表达式。

请注意,左括号和右括号都以反斜杠 ( \) 为前缀,以防止 shell 进行评估。

  • 如果你正在对 `find` 结果执行 `-exec` 或任何其他操作,请记住将整个条件用括号括起来,否则 `-exec` 将仅适用于最后一个 `-or`-ed标准。要处理所有这些,请将它们括起来:`find \( <criterion> -o <criterion> \) -exec <command>` (16认同)
  • 为了不区分大小写,可能需要考虑 -iname 而不是 -name (3认同)

Ale*_*ach 64

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

 find ./ ! -regex  '.*\(deb\|vmdk\)$'
Run Code Online (Sandbox Code Playgroud)

  • 请注意,`-regex` 的可移植性低于 `-name`。 (8认同)
  • 不应该是公认的答案。问题要求使用带有“find -name”的多个名称模式的解决方案。塞尔吉的回答回答了这个问题。 (2认同)

Den*_*din 37

您已接近解决方案:

find /media/d/ -type f -size +50M -and ! -name "*deb" -and ! -name "*vmdk"
Run Code Online (Sandbox Code Playgroud)

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

-a   -and      - operator AND
-o   -or       - operator OR
!              - operator NOT
Run Code Online (Sandbox Code Playgroud)

  • 看起来您实际上并没有改变用户“find”命令的效果。请注意,如果缺少显式运算符,则“-a”是默认运算符。另请注意,如果您使用“-o”,则两个名称测试必须有逻辑分组。您可以使用“\( ... \)”来执行此操作。 (2认同)

小智 7

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

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

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