メインコンテンツまでスキップ

Glob パスマッチングをマスターする:構文の基礎と実践的な応用

· 約5分
AIMDX 編集

ソフトウェア開発やシステム管理において、大量のファイルをバッチ処理したり、特定のパスを検索したりすることは頻繁に求められます。このような場面で、「Glob パスマッチング (Globbing)」は欠かせない実用的なスキルとなります。Linux ターミナルの操作、.gitignore ファイルの設定、あるいは CI/CD パイプラインでのビルド範囲の指定など、Glob 構文は至る所で利用されています。

本記事では、Glob の基本的な構文と一般的なユースケースを紹介し、ファイルのフィルタリングとマッチングの精度と効率を向上させます。

Glob パターンマッチングの概念

Glob とは?

Glob は、ワイルドカード(Wildcard)に基づいたパターンマッチング(Pattern Matching)技術の一種です。この名前は、初期の Unix バージョンに存在した glob(global の略)というコマンドプログラムに由来しています。正規表現(Regular Expression)と同様に文字列のマッチングに使用できますが、Glob の構文はよりシンプルで直感的であり、ファイルやパス名のマッチングに特化して設計されています。

コアとなる Glob 構文ガイド

以下の重要な記号をマスターすれば、大半のパスマッチングのニーズに対応できます:

1. アスタリスク * (単一ディレクトリのマッチング)

アスタリスクは Glob で最も一般的な記号です。任意の長さの文字(0文字を含む)にマッチしますが、ディレクトリの階層をまたぐことはできません

  • *.txt:現在のディレクトリにあるすべての txt 拡張子のファイルにマッチします(例:readme.txt, data.txt)。
  • app_*:現在のディレクトリにある app_ で始まるすべてのファイルまたはフォルダにマッチします(例:app_web, app_config.json)。

2. ダブルアスタリスク ** (複数ディレクトリをまたぐマッチング)

ダブルアスタリスクは、強力な再帰的マッチング記号です。任意の階層のディレクトリ構造にマッチします。

  • **/*.js:すべてのフォルダおよびサブフォルダ内の JavaScript ファイルにマッチします。これはフロントエンドプロジェクトのビルドや Linter の設定時に非常に役立ちます。
  • src/**/test/src ディレクトリ以下、任意の深さにある test という名前のフォルダにマッチします。

3. クエスチョンマーク ? (単一文字のマッチング)

クエスチョンマークは、単一の文字に正確にマッチするために使用されます。

  • file_?.txtfile_1.txt, file_A.txt にはマッチしますが、file_12.txt にはマッチしません。

4. 角括弧 [] (文字集合のマッチング)

角括弧は、文字の集合または範囲を定義することを可能にします。文字列の該当位置が集合内のいずれかの文字と一致すれば、マッチ成功となります。

  • [abc].mda.md, b.md, c.md にマッチします。
  • image-[0-9].jpgimage-0.jpg から image-9.jpg にマッチします。
  • [!a-c].txt または [^a-c].txt! または ^ を使用して否定マッチングを表し、a、b、c 以外の文字で始まるテキストファイルにマッチします。

5. 波括弧 {} (複数パターンのマッチング)

波括弧は、複数のマッチングパターンのオプションを提供し、複数のルールを組み合わせるために使用されます。

  • *.{jpg,png,gif}:すべての jpg、png、または gif 画像ファイルにマッチします。
  • src/{components,utils}/*.jssrc/components および src/utils ディレクトリ内のすべての .js ファイルにマッチします。

実践的なユースケース

基本的な構文を理解した上で、Glob の日常的な開発における典型的な用途をいくつか紹介します:

.gitignore の設定

Git バージョン管理では、追跡不要なファイルを除外するために Glob がよく使用されます:

# すべての node_modules ディレクトリを無視する
node_modules/

# すべての .log ファイルを無視する
*.log

# build ディレクトリ内のすべてのファイルを無視する
build/**

CI/CD と自動化スクリプト

GitHub Actions や GitLab CI の設定ファイルを記述する際、どのファイルの変更がデプロイをトリガーするかを定義します:

on:
push:
paths:
- 'src/**/*.ts'
- 'src/**/*.tsx'
- '!src/**/*.test.ts' # テストファイルを除外する

フロントエンド開発ツールとバンドラー

Webpack、Vite、ESLint などの開発ツールにおいて、コンパイルまたは検査の対象範囲を指定するために Glob が頻繁に利用されます。

// ESLint 設定例
module.exports = {
ignorePatterns: ["dist/**/*.js", "node_modules/"],
};

まとめ

Glob は、ファイルをフィルタリングして検索するための洗練された効率的な方法を提供します。複雑なループ処理や文字列比較と比較して、正しい Glob パターンを利用することで、開発ワークフロー、設定、スクリプトがより簡潔になり、メンテナンス性が向上します。Glob パターンを熟練して使いこなすことは、開発および保守作業の大幅な効率アップをもたらします。