我想搜索不符合 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\)'
反斜杠是转义字符;.
匹配单个字符,并*
用于匹配前一个字符零次或多次,因此.*
意味着匹配零个或多个字符。