ファイルのパス指定で**/*.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コマンド実行時のファイルパスの指定によく利用するのでスッキリできましたし、
覚えておくと作業効率も向上するように思います。
0 件のコメント:
コメントを投稿