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

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


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

#1 楼

您也可以使用否定的-regex来执行此操作:-

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


评论


请注意,-regex的可移植性低于-name。

– jw013
2012-10-12 13:54

不应是公认的答案。问题要求使用带有find -name的多个名称模式的解决方案。塞尔吉的答案回答了这一问题。

– Veverke
20 Nov 24在12:04



#2 楼

是的,您可以:

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


POSIX规范中的说明:


!表达:否定一次;一元NOT运算符。

(expression):如果expression为true,则为true。

表达式-o表达式:原语的替换; OR运算符。如果第一个表达式为true,则不对第二个表达式求值。


请注意,括号(无论是打开还是闭合)都以反斜杠(\)为前缀,以防止被shell求值。

评论


如果对查找结果执行-exec或其他任何操作,请记住在整个条件后加上\(\),否则-exec仅适用于最后一个或操作的条件。要对所有这些进行处理,请在它们之间加上括号:find \( -o \)-exec

– Victor Sergienko
19年6月13日在20:38

这应该是公认的答案

–swe
20 Sep 29 '13:17

可能需要考虑使用-iname而不是-name来区分大小写

–卢克·雷曼(Luke Rehmann)
20-10-9在16:57



#3 楼

您已接近解决方案:

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


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

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


评论


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

– Kusalananda♦
20-2-7在12:29

绝对不可思议。这个“查找”命令正在改变我的生活。

– jDub9
20/11/19在6:31

#4 楼

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

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


反斜杠是转义字符; .匹配单个字符,而*用于匹配零个或多个字符,因此.*表示匹配零个或多个字符。

评论


添加说明将使您的答案更好。

– N.N.
2012年10月12日14:01

你是对的。添加了一些说明。

–user22304
2012年10月12日14:09