Cly*_*ost 1 find regular-expression wildcards
我试图用来find
识别我的存储库中名为“version”或“version.h”的所有文件,但是我无法想出一个有效的 glob 来匹配。
使用正则表达式,我相信这会起作用: .*/version\.*h*
但是我无法想出 glob 语法中的等价物。
但是我无法想出 glob 语法中的等价物。
我认为你不能,因为常规的 glob 没有交替或分组。你能得到的最接近的是version*
,但当然也与其他人相匹配。
尽管使用 ksh 样式的扩展 glob 或 zsh,您可以这样做:
(重击)
$ shopt -s globstar
$ shopt -s extglob
$ echo **/version?(.h)
Run Code Online (Sandbox Code Playgroud)
(ksh)
$ set -o globstar
$ echo **/version?(.h)
Run Code Online (Sandbox Code Playgroud)
(zsh)
% echo **/version(|.h)
Run Code Online (Sandbox Code Playgroud)
许多版本也find
可以使用正则表达式,但可用的正则表达式变体有所不同。BSDfind
默认使用基本正则表达式 (BRE),但支持带有以下-E
标志的扩展正则表达式:
$ find -E . -regex ".*/version(\.h)?"
Run Code Online (Sandbox Code Playgroud)
在 GNU 中find
,默认值不同(*),但是:
$ find . -regextype posix-extended -regex ".*/version(\.h)?"
Run Code Online (Sandbox Code Playgroud)
或者您可以使用杰夫建议的简单解决方案:
$ find . -name version -o -name version.h
Run Code Online (Sandbox Code Playgroud)
请注意,如果添加显式操作(而不是默认打印),则需要括号,如下所示:
$ find . \( -name version -o -name version.h \) -a -exec ls -ld {} +
Run Code Online (Sandbox Code Playgroud)
as -a
(省略时隐含)优先于-o
.
(* 实际上,GNU find 的参考手册似乎无法确定默认的正则表达式格式是什么,请在此处比较最后两个条目。)