bash globstarマッチング


17

私はこのディレクトリ構造を持っています:

~/tmp/globstar ɀ  find dir -type f
dir/file.ext
dir/subdir1/file.ext
dir/subdir2/file.ext

そして、globstarBashでオプションを有効にすると、私は言うことができます:

~/tmp/globstar ɀ  ls -1 dir/**/*.ext
dir/subdir1/file.ext
dir/subdir2/file.ext

私の質問は、なぜdir/file.extこのリストから除外されるのですか?

Bashマニュアルはこれについて述べていglobstarます:

設定されている場合、ファイル名展開コンテキストで使用されるパターン「**」は、すべてのファイルとゼロ個以上のディレクトリとサブディレクトリに一致します。パターンの後に「/」が続く場合、ディレクトリとサブディレクトリのみが一致します。

この段落の「ゼロ」にdir/file.extは、含めるべき印象があります。うまく行かない場合を除きます。


2
このキャラクターは何ですか?ɀ
slm

2
どのバージョンのbashのどのバージョンですか?Debian wheezyのbash 4.2.37またはDebian squeezeのbash 4.1.5ではこれを再現できません。@slm unicode ɀまたはウィキペディア
ジル「SO-悪であるのをやめる」14年

1
@Gillesそれはプロンプトですか?
slm

5
slm、はい!ɀプロンプトを区別するためにここで使用される単なる文字です。一部のユーザーは、文字を好む£$:)の代わりに。元々、ɀ特別なアフリカ言語表記のために作成された 'z'キャラクター:-)
Slyx 14

1
OS X 10.9に同梱されている「GNU bash、バージョン3.2.53(1)-release(x86_64-apple-darwin13)」にはこの動作があります。
natevw

回答:


8

これはサブディレクトリレベルのみを指していると思います。マッチ**なし/

  1. すべてのファイルとディレクトリ

  2. 0個以上のサブディレクトリ

しかし、完全に消えるわけではありません。**/は、**適用される最上位ディレクトリのファイルが一致しないことを意味します。

あなたが必要dir/*.ext dir/**/*.extです。


ええ、それはまさに私のフォールバックで、見た目がきれいではありません。;-)
Vlad GURDIGA 14

9

これは、リストされているディストリビューションで提供されているこれらのバージョンのBashで期待どおりに機能します。

  • 4.1.2(1)— CentOS 6.5
  • 4.1.5(1)— Debian 6.0.10
  • 4.1.10(4)— Cygwin 1.7.31
  • 4.2.46(1)— CentOS 7.1
  • 4.3.11(1)— Ubuntu 14.04.1
  • 4.3.30(1)— Debian 8.1

実際、上記のバージョンがすべてテスト済みです。言い換えると、機能しないBashのバージョン4は見つかりませんでした。このオプションglobstarはBash 4.0で追加されたCHANGESを参照してください。古いバージョンでは、コマンドshopt -s globstarはエラーを返します。

テスト

1. dir/**/*.extマッチdir/file.ext

~/tests$ ls -1 dir/**/*.ext
dir/file.ext
dir/subdir1/file.ext
dir/subdir2/file.ext

2. **/*.extマッチfile.ext

~/tests$ cd dir
~/tests/dir$ ls -1 **/*.ext
file.ext
subdir1/file.ext
subdir2/file.ext

上記のテストを再現するための環境の準備

mkdir -p dir/subdir{1,2}
touch dir/{,subdir{1,2}/}file.ext
shopt -s globstar

1
これが正しい答えです。OPは設定を忘れていましたshopt -s globstar
CSペイ

4

私はグロスターをオフにした/持っているように見えます。次のようにオンにできます。

shopt -s globstar

ゼロのサブディレクトリと一致しないだけでなく、2つのサブディレクトリとも一致しません。

$ find dir -type f #the same as yours except with a directory inside one of the subdirectories
dir/file.ext
dir/subdir1/file.ext
dir/subdir1/subsubdir/file.ext
dir/subdir2/file.ext
$ shopt -u globstar #turn globstar off
$ #will only show files in subdirectories
$ #will not show files in dir or in subsubdir
$ echo dir/**/*.ext
dir/subdir1/file.ext dir/subdir2/file.ext
$ shopt -s globstar #turn globstar on
$ #will show all four files
$ echo dir/**/*.ext
dir/file.ext dir/subdir1/file.ext dir/subdir1/subsubdir/file.ext dir/subdir2/file.ext

globstarがオフの場合、**は*と同じように動作するためdir/**/*.ext、同じ結果が得られます。dir/*/*.ext

$ echo dir/*/*.ext
dir/subdir1/file.ext dir/subdir2/file.ext

グロブスターがオンになっていると思わせる

現在のglobstar設定を次のように確認してください。

shopt | grep globstar

1
のように、シェルオプションの設定を直接確認できますshopt globstar
ベンジャミンW.
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.