Glob / .gitignore テスター
パスの一覧に対して glob パターンと .gitignore ルールを試し、どのパスがどのルールで一致するかを確認します。
コード例
自分のプロジェクトにコピーして使えます。どの例も言語の標準ライブラリだけを使うので、インストールするものはありません。
const pattern = '*.log'
const names = ['app.log', 'readme.md', 'error.log']
// * stays inside one path segment, ? is one character, everything else is literal.
const source = pattern.replace(/[.+^${}()|[\]\\]/g, '\\$&').replace(/\*/g, '[^/]*').replace(/\?/g, '[^/]')
const matcher = new RegExp(`^${source}$`)
for (const name of names.filter((candidate) => matcher.test(candidate))) {
console.log(name)
}できること
パスの一覧に対して glob パターンと .gitignore ルールを試します。各パスに一致・不一致の印と、その原因のパターンが並んで表示されるので、src/lib/util.test.ts が対象になる理由、ならない理由が分かります。
使い方
- パスに1行1パスで貼り付けるか、テキストファイルをドロップします。
- パターンに1行1パターンで書きます。
#で始まる行はコメントです。 - Glob、Bash、Gitignore を選び、すべてのパス、一致のみ、不一致のみを表示します。
- 結果をコピーします。
例
パターン src/**/*.ts と !**/*.test.ts では、パス src/lib/util.ts は一致し、src/lib/util.test.ts は除外が優先されて一致しません。.gitignore ルール *.log と !keep.log では、app.log は無視され、keep.log は無視されません。
知っておくと便利なこと
*は1つのディレクトリ内、**はディレクトリをまたぎ、?、[ab]、{a,b}は picomatch と同じように動きます。.envのようなドットファイルは、ドットファイルを含めるをオンにするか、パターンがドットを明示したときだけ一致します。- Glob と Bash では、
!で始まるパターンが他のパターンの一致を除外します。Gitignore では Git と同じく最後に一致したルールが優先されます。 - Bash は
globstarのないシェルのように**を通常の*として読みます。 - パスはテキストとして照合されます。ディスクからは何も読み込みません。
3つの構文の違いは?
Glob は多くのビルドツールが使う picomatch 構文です。* は1つのディレクトリ内、** はディレクトリをまたぎ、{a,b} のような波括弧、[ab] のような文字クラス、? も使えます。Bash は globstar なしのシェルのように ** を通常の * として読みます。Gitignore は .gitignore のルールに従い、末尾の / はディレクトリ、先頭の / はルートへの固定、後の ! ルールは前のルールで除外されたものを再び含めます。
よくある質問
パスの横に表示されるルールは?
最初に一致したパターンです。glob と bash では、除外(! で始まるパターン)で外れたパスにはその除外が表示されます。gitignore では、そのパスを無視したルールが表示されます。
* がドットで始まるファイルに一致しないのはなぜ?
パターンがドットを明示しない限り、glob はドットファイルを飛ばします。「ドットファイルを含める」をオンにすると、bash の dotglob のように * と ? が一致します。.gitignore にこの切り替えはありません。
このツールはパスをどこかに送信しますか?
いいえ。すべてブラウザ内で行われます。入力した内容が当社のサーバーに送信されることはありません。