我试图用来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 的参考手册似乎无法确定默认的正则表达式格式是什么,比较一下最后两个条目在这里.)