查找和正则表达式

查找和正则表达式

我这个 find 表达式做错了什么?

; touch ook ooks
; find . -name 'ook' -or -name 'ooks' -type f
./ook
./ooks
; find . -name 'ook[s]?' -type f      
[returns nothing]
; echo $?
0

答案1

您将正则表达式与 shell 搜索模式混淆了。

?在 shell 中表示任何单个字符。

?在正则表达式中表示前一个字符(或子模式)是可选的。

尝试:

find . -regex '.*ooks?' -type f

从查找手册页:

       -正则表达式模式
              文件名与正则表达式模式匹配。这是一场比赛
              整个路径,而不是搜索。例如,要匹配一个文件
              名为“./fubar3”,您可以使用正则表达式“.*bar”。或者
              ‘.*b.*3’,但不是‘f.*r3’。正则表达式理解
              by find 默认是 Emacs 正则表达式,但这可以
              使用 -regextype 选项进行更改。

答案2

这个答案至少适用于 GNU find。

-name使用 shell 模式进行匹配,如果您想进行正则表达式匹配,请改用-regex

 find . -regex '.*ook[s]?' -type f

-regex使用 emacs 正则表达式匹配整个路径。正则表达式类型可以用 更改-regextype

相关内容