-name
条件的文件。我可以这样做:find /media/d/ -type f -size +50M ! -name "*deb" ! -name "*vmdk"
这将产生适当的结果,但是我可以用OR或以某种方式加入这两个条件吗?
#1 楼
您也可以使用否定的-regex
来执行此操作:- find ./ ! -regex '.*\(deb\|vmdk\)$'
#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 \(
– 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
评论
请注意,-regex的可移植性低于-name。
– jw013
2012-10-12 13:54
不应是公认的答案。问题要求使用带有find -name的多个名称模式的解决方案。塞尔吉的答案回答了这一问题。
– Veverke
20 Nov 24在12:04