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

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

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

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

但我无法想出一个等效的 glob 语法。

答案1

但我无法想出一个等效的 glob 语法。

我认为你不能,因为常规的 glob 没有交替或分组。你能得到的最接近的结果是version*,但当然它也与其他的相匹配。

尽管使用 ksh 风格的扩展 glob 或 zsh,您可以做到这一点:

(重击)

$ shopt -s globstar
$ shopt -s extglob
$ echo **/version?(.h)

(克什)

$ set -o globstar
$ echo **/version?(.h)

(zsh)

% echo **/version(|.h) 

许多版本find也可以使用正则表达式,但可用的正则表达式变体有所不同。 BSDfind默认使用基本正则表达式 (BRE),但支持带有以下-E标志的扩展正则表达式:

$ find -E . -regex ".*/version(\.h)?"

在 GNU 中find默认不同(*), 但 :

$ find . -regextype posix-extended -regex ".*/version(\.h)?"

或者您可以使用杰夫建议的简单解决方案:

$ find . -name version -o -name version.h

但请注意,如果添加显式行动(而不是默认打印),您需要括号,如下所示:

$ find . \( -name version -o -name version.h \) -a -exec ls -ld {} +

as -a(省略时隐含)优先于-o.

(* 实际上,GNU find 的参考手册似乎无法确定默认的正则表达式格式是什么,比较一下最后两个条目在这里.)

相关内容