我正在尝试根据不同的条件在目录中查找文件或文件夹:
这是我迄今为止最好的选择:
find -name 'w*' || find -name '*x' || 'find -name 'y*' & find -name '*z!'
这显然不起作用。没有明显的错误消息,只是它没有找到我正在寻找的所有文件。
您可以使用
-o
指定多个谓词来对它们进行 OR 运算。
find -name 'w*' -o -name '*x' -o -name 'y*z!'
同样,您可以使用单个
-regex
来捕获所有这些条件。
find -regex '.*/\(w[^/]*\|[^/]*x\|y[^/]*z!\)'
(注意
-regex
的参数如何应用于整个路径,以及与大多数现代正则表达式方言相比,开箱即用的正则表达式语法如何在一些奇怪的地方需要反斜杠。显然,正则表达式与常规通配符不同;在正则表达式, .*
匹配任何字符串,[^/]*
匹配不能是斜杠的字符序列。这里的正则表达式语法适用于 GNU find
,但不适用于 MacOS / BSD find
; -E
选项并删除 (
、|
和 )
之前的反斜杠。)
尚不清楚您希望
||
会做什么。如果第一个失败,它会运行第二个 find
,但它不会(除非你给它提供无效的谓词或其他东西;找不到任何文件不是错误)。
更令人困惑的是,
&
在后台运行该作业;您可能正在寻找 &&
,但它也达不到您想要的效果。您尝试的操作可能会非常低效地简单地完成
find -name 'w*'
find -name '*x'
find -name 'y*z!'
虽然重复的遍历可能会多次报告同一个文件。但您希望避免这种情况,并且只遍历目录树一次,因为这可能是一项非常繁重的操作。 (从语法上讲,如果您想强制它成为单行,则可以用分号替换命令之间的换行符。)
如果您想添加其他条件,也许请注意如何需要括号来对
-o
选项进行分组:
find -type f \( -name 'w*' -o -name '*x' -o -name 'y*z!' \)