使用 Shell 查找具有不同和/或条件的

问题描述 投票:0回答:1

我正在尝试根据不同的条件在目录中查找文件或文件夹:

  • 所有以 W 或 开头的文件,
  • 所有以 X 或结尾的文件,
  • 所有以 Y 开头并以 Z 结尾的文件!。

这是我迄今为止最好的选择:

find -name 'w*' || find -name '*x' || 'find -name 'y*' & find -name '*z!'

这显然不起作用。没有明显的错误消息,只是它没有找到我正在寻找的所有文件。

linux shell find
1个回答
2
投票

您可以使用

-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!' \)
© www.soinside.com 2019 - 2024. All rights reserved.