我这个 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
。