node-glob のパターンの書き方

以下のようなファイル構造だとします。

.
├── ba
│   └── z.mdx
├── bar
│   └── b.mdx
├── baz
│   └── c.mdx
└── foo
    └── a.mdx

3 directories, 3 files

0か複数

*を使うと0か複数を表せます。

glob('ba*/**/*.mdx', (_, files) => {
  console.log(files);
});

これは[ 'ba/z.mdx', 'bar/b.mdx', 'baz/c.mdx' ]を得ます。*の部分は無いものでもマッチするのでbaも含まれます。

1か複数

?を使うと1か複数を表せます。

glob('ba?/**/*.mdx', (_, files) => {
  console.log(files);
});

これは[ 'bar/b.mdx', 'baz/c.mdx' ]を得ます。?は必ず何かしらの文字列がある必要があるので今度はbaは含まれません。

範囲

[]で囲むと範囲という意味になります。例えば[a-z]a,b,c,d,...みたいな意味になります。

glob('qqqq/ba[a-z]/**/*.mdx', (_, files) => {
  console.log(files);
});

よってこれも[ 'bar/b.mdx', 'baz/c.mdx' ]を得ます。

完全マッチの複数

@(foo|b?r)と書くとfoob?rの時にマッチします。中で?*など使えるので柔軟に複数指定できます。

glob('qqqq/@(foo|bar)/**/*.mdx', (_, files) => {
  console.log(files);
});

これは[ 'foo/a.mdx', 'bar/b.mdx' ]を得ます。

複数マッチの否定

!(foo|bar)と書くとfoobarじゃないものにマッチします。

glob('qqqq/!(foo|bar)/**/*.mdx', (_, files) => {
  console.log(files);
});

これは[ 'qqqq/baz/c.mdx' ]を得ます。

何でもいいディレクトリ

**を使うとディレクトリの名前・どこにあるかに関係なくマッチするようにできます。

glob('**/*.mdx', (_, files) => {
  console.log(files);
});

これは[ 'foo/a.mdx', 'bar/b.mdx', 'baz/c.mdx' ]を得ます。これはhoge/fuga/piyo/a.mdxというようなファイルであってもマッチします。