文件 glob 匹配“version”和“version.h”

Cly*_*ost 1 find regular-expression wildcards

我试图用来find识别我的存储库中名为“version”或“version.h”的所有文件,但是我无法想出一个有效的 glob 来匹配。

使用正则表达式,我相信这会起作用: .*/version\.*h*

但是我无法想出 glob 语法中的等价物。

ilk*_*chu 5

但是我无法想出 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 的参考手册似乎无法确定默认的正则表达式格式是什么,请在此处比较最后两个条目。)