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

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

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

GLOB

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

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

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

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

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

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


#前提としてディレクトリ構造とファイルパスは以下のような状態だとします。
$ 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

0 件のコメント:

コメントを投稿

楽天ペイのSuicaにチャージする時の認証を変更する

Androidのスマホで楽天ペイに連携したSuicaにチャージしようとしたところ指紋認証が反応しない、、、 そんな時は別の認証方法に変更することができますので手順を残しておきます。 環境 今回使用したスマホとアプリは以下になります。 モデル:901SO(Xperia 5) And...