「version」と「version.h」と一致するファイルglob

「version」と「version.h」と一致するファイルglob

findリポジトリで名前が「version」または「version.h」のファイルをすべて識別しようとしていますが、一致する有効なglobを指定することはできません。

正規表現を使うと、これがうまくいくと思います。.*/version\.*h*

しかし、同等のglob構文を見つけることはできません。

答え1

しかし、同等の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正規表現を使用することもできますが、利用可能な正規表現のバリエーションはさまざまです。 BSDはfindデフォルトでデフォルトの正規表現(BRE)を使用しますが、-E次のフラグを使用して拡張正規表現をサポートします。

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

findGNUからデフォルト値が異なります(*)、しかし:

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

あるいは、Jeffが提案した簡単なソリューションを使用することもできます。

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

しかし、明示的に追加すると行動(デフォルトで印刷する代わりに)次のような角かっこが必要です。

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

as -a(省略した場合は暗示)が優先されます-o

(*実際には、GNU findリファレンスマニュアルではデフォルトの正規表現形式が何であるかを判断できないようです。最後の2つの項目はここにあります。.)

関連情報