ファイルパスの**(アスタリスク2つ)って何??

GLOB プログラミング
GLOB

ファイルのパス指定で**/*.yamlのような記述を見かけたのですが、
**とはなんだろう。。

なんとなく正規表現ぽいんだろうな、、とは思いますが
であればワイルドカードで指定する場合アスタリスクは一つで良いはずです。
モヤモヤするので調べてみました。

GLOB

GLOBというワイルドカードパターン。

ワイルドカードパターンは正規表現と多少似ているが、しかしこの両者は異なる。 まず第一に、前者がファイル名にマッチするのに対して、 後者はテキストにマッチする……

https://linuxjm.osdn.jp/html/LDP_man-pages/man7/glob.7.html

とのこと。
正規表現との違いとして重要なのはGLOBはテキストにマッチするのではなく、
ファイル名にマッチするということ。
ファイル名を指定する場合は正規表現ではなかったんですね、、認識できていませんでした。。

ですので、**/*.yamlのようにアスタリスク2つで記述した場合、
カレントディレクトリ配下のYAMLファイルを再起的に対象とします。

以下のコマンドで実際に確認できます。

#前提としてディレクトリ構造とファイルパスは以下のような状態だとします。
$ find .
.
./bbb
./bbb/test-b.yml
./ccc
./ccc/ddd
./ccc/ddd/test-d.yml
./ccc/test-c.yml
./aaa
./aaa/test-a.yml

#見づらかったためtreeコマンドをインストール
$ brew install tree

# 再出力
$ tree
.
├── aaa
│   └── test-a.yml
├── bbb
│   └── test-b.yml
└── ccc
    ├── ddd
    │   └── test-d.yml
    └── test-c.yml

# globでパス指定して再起的に出力する
$ ls -1 **/*.yml
aaa/test-a.yml
bbb/test-b.yml
ccc/ddd/test-d.yml
ccc/test-c.yml

カレントディレクトリ配下のYAMLファイルが全て再起的に対象となりました。
ちなみにアスタリスク1つにすると以下のようになります。

# 1階層下を対象とする
# ls -1 */*.yml
aaa/test-a.yml
bbb/test-b.yml
ccc/test-c.yml

# 2階層下を対象とする
ls -1 */*/*.yml
ccc/ddd/test-d.yml

また、上記のようにディレクトリが複数ある場合で、対象とするディレクトリを絞りたい場合には
中括弧の中にディレクトリ名をカンマ区切りで指定することができます。
例えば、aaa、bbbディレクトリ配下のYAMLファイルだけを対象とする場合、
次のように指定できます。

$ ls -1 {aaa,bbb}/*.yml
aaa/test-a.yml
bbb/test-b.yml

aaa、bbbディレクトリのYAMLが対象となり、cccディレクトリのYAMLファイルは対象外となりました。

私の端末ではzshを使っているので上記で動作しましたが、
bashの場合、デフォルトでは動作しない模様。
bash 4.0以上であれば、**(globstar)を有効にすることで利用できます。

# 利用中のシェルを確認
$ echo $SHELL

# bashの場合、globstarを有効(on)にする
$ shopt -s globstar

# globstarがonになったことを確認
$ shopt

# もしくはzshがインストールされている場合はシェルを切り替える
$ zsh

いかがでしょうか。
個人的にはGItコマンド実行時のファイルパスの指定によく利用するのでスッキリできましたし、
覚えておくと作業効率も向上するように思います。

参考

https://linuxjm.osdn.jp/html/LDP_man-pages/man7/glob.7.html
Globstar: New Bash Globbing Option | Linux Journal
nekopan

Web系ソフトウェアエンジニアです。
会社員 -> フリーランス(現在)。
ITに関することやライフハック情報を発信しています。
皆さんの悩みや不安を少しでも解消できたら幸いです🐾

nekopanをフォローする
プログラミング
スポンサーリンク
シェアする
nekopanをフォローする
へるぷログ
タイトルとURLをコピーしました