グロブ(英: glob)とは主にUnix系環境において、ワイルドカードでファイル名のセットを指定するパターンのことである。例えば、UNIXのコマンド「`mv *.xlsx 営業実績/`」はカレントディレクトリから`営業実績/`ディレクトリへと`.xlsx`で終わる全てのファイルを移動する。ここで、`*`は「任意の文字列」を表すワイルドカードであり、`*.xlsx`はグロブである。`*`以外に一般的なワイルドカードは疑問符 (`?`) であり、これは任意の1文字を表す。

## 起源

UNIXの初期バージョン(1969年の「1st」版から1975年の「6th」版まで)におけるコマンドインタプリタでは、コマンドへの引用符で囲まれていない引数内に含まれるワイルドカードの展開は、インタプリタとは独立した `/etc/glob` というプログラムに依存していた。このプログラムが展開を行い、実行するコマンドへ展開されたファイルパスリストを提供した。この名前はグローバル・コマンドの略語である。後にこれは機能的に `glob` というライブラリ関数として提供され、シェルなどのプログラムで利用されている。

## 構文

最も一般的なワイルドカードは`*`、`?`、および`[...]`である。

| ワイルドカード | 解説 | 使用例 | | |
| --- | --- | --- | --- | --- |
| グロブ表現 | マッチする文字列の例 | マッチしない文字列の例 |
| `*` | 0文字以上の任意の文字列にマッチ | `営業*` | `営業`、`営業実績` | `営`、`2019年度営業`、`2019年度営業計画` |
| `*営業*` | `営業`、`営業実績`、`2019年度営業`、`2019年度営業計画` | `営` |
| `?` | 任意の1文字にマッチ | `営業実績?` | `営業実績1`、`営業実績B` | `営業実績`、`営業実績12` |
| `[c1c2...cN]` | 括弧内で列挙されたどれか1文字にマッチ | `営業実績[123]` | `営業実績1`、`営業実績2`、`営業実績3` | `営業実績`、`営業実績4`、`営業実績12`、 |
| `[cmin-cmax]` | 括弧内で指定された範囲内の1文字にマッチ | `営業実績[0-9]` | `営業実績1`、`営業実績3`、`営業実績4`、`営業実績5`、`営業実績9` | `営業実績`、`営業実績10`、`営業実績B`、`営業実績2019` |

いずれの場合においても、パス区切り文字(UNIXでは`/`、Windowsでは`\`)にマッチすることは絶対にない。

### UNIX

LinuxやPOSIXのシステムでは`*`および`?`が定義されているが、`[...]`には以下の2つが追加されている:

| ワイルドカード | 解説 | 使用例 | | |
| --- | --- | --- | --- | --- |
| グロブ表現 | マッチする文字列の例 | マッチしない文字列の例 |
| `[!c1c2...cN]` | 括弧内で列挙されていない何かの1文字にマッチ | `営業実績[!456]` | `営業実績1`、`営業実績9`、`営業実績B` | `営業実績`、`営業実績4`、`営業実績5`、`営業実績6`、`営業実績12` |
| `[!cmin-cmax]` | 括弧内で指定されていない範囲内の1文字にマッチ | `営業実績[!3-5]` | `営業実績1`、`営業実績9`、`営業実績B` | `営業実績`、`営業実績3`、`営業実績4`、`営業実績5`、`営業実績10`、`営業実績2019` |

(C ShellやBashなどの)シェルの中には、AlternationやBrace Expansionとして知られる追加の構文をサポートしているものもある。

Bashは上記以外のパターンマッチ演算子を使用して、括弧で囲まれたパターンの複数発生へのマッチを可能にするextended globbing(拡張グロブ)もサポートする。この機能は`extglob`シェルオプションをセットすることで有効になる。

### Windows PowerShell

Windows PowerShellは、上記で述べたものと同様に定義された構文を全て搭載しているので、機能追加を行う必要はない。

### Windows

MS-DOSおよびWindowsの、COMMAND.COM と cmd.exe は、グロブ展開を行わず、コマンドラインにあるワイルドカードの `*` などは起動するプログラムにそのまま渡され、プログラム側で対応していればそれなりの動作をする(かもしれない)。シェルの内部コマンドなどで解釈される場合については制限付きながらほぼ同様の構文を持つが、構文が一見似ているだけで、「制限付き」の制限のおかげで全く別物であり、`[...]`は存在せず、さらにCOMMAND.COMの`*`はパターンの終わりにしか付けられない。

### SQL

SQLの、`LIKE`条件中のパターンには、`?`や`*`に相当する表現が使える。`[...]`に相当する表現は存在しない。

| 通常のワイルドカード | SQLのワイルドカード |
| --- | --- |
| `?` | `_` |
| `*` | `%` |

標準SQLにおける`LIKE`条件では、単純な文字列マッチにグロブと似た構文を利用する。パーセント記号 (`%`) は0文字以上の文字列にマッチし、アンダースコアは1文字にマッチする。しかしながらSQLコミュニティにおいて「グロブ」という用語は一般的ではない。SQLの実装の多くは`LIKE`条件を拡張し、正規表現の要素を取り入れた、より豊富なパターンマッチを可能としている。

独自拡張SQLの中にはTransact-SQLのように、`[...]`の機能を提供するものもある。この例が`[characters]`や`[^characters]`である。

## 正規表現との比較

グロブには、式の前にある部分を複数回繰り返すことを可能とする、クリーネ閉包が無いなど、正規表現とは異なったものである。

| ワイルドカード | 等価の正規表現 |
| --- | --- |
| `?` | `.` |
| `*` | `.*` |

グロブは文字列全体とのマッチを試みる。例えば、`営業実績*.xlsx` は `営業実績.xlsx` や `営業実績10月.xlsx` にマッチするが、`営業実績.xls` や `2020年度営業実績.xlsx` や `営業実績.docx` にはマッチしない。

## 実装

Bash、tcsh、およびzshなどのUnixシェルは、コマンドラインやシェルスクリプトにおいてファイル名のグロブを提供する。

Windowsのコマンドラインインタプリタであるcmd.exeは、グロブを行うアプリケーションのランタイム関数に依存している。Windows PowerShellのCmdletはグロブをサポートする。

より一般的には、上記で述べたような種類の限定されたパターンマッチング機能をUnixシェル以外の環境で引き合いに出すためにも「グロブ」という用語は使用される。Unixシェル以外の環境におけるグロブの例を以下に示す:

- D言語では`std.path`モジュールに`globMatch`が搭載されている。
- Node.jsには`minimatch`と呼ばれるライブラリが搭載されている。これはnpmや`micromatch`によって内部的に利用されており、より最適化された、正確で安全なグロブの実装である。
- Goには`filepath`パッケージに`Glob`関数が搭載されている。
- Javaにはグロブパターンを操作するメソッドを含む、`Files`クラスが搭載されている。
- Haskellにはメインモジュールである`System.FilePath.Glob`に`Glob`パッケージが搭載されている。パターンの構文はzshのサブセットをベースとしている。このグロブは与えられたパターンの最適化を試みるので、単純な文字単位で行うマッチよりも格段に速いはずである。
- Perlには`glob`関数(ラリー・ウォールの著書であるプログラミングPerlで議論されている)と、BSDのグロブルーチンを模倣するGlob拡張の2つが搭載されている。同様にして`<*.log>`のように、Perlの山括弧もグロブに利用できる。
- PHPには`glob`関数が搭載されている。
- Pythonには標準ライブラリに、ファイル名に対してワイルドカードパターンマッチングを行う`glob`モジュールが搭載され、さらに文字列をマッチしたり、ファイル名に対するものと同じワイルドカードパターンに基づいて、文字列やフィルタリングリストとのマッチを行うための関数を含む`fnmatch`モジュールが搭載されている。Pythonプログラミング言語の著者であるグイド・ヴァンロッサムは、1986年にBSD UNIXの`glob`ルーチンを書いて寄与した。彼による以前の`glob`ルーチンは、以前のBSDリリースに含まれていたexとftpプログラムなどに含まれていた。
- Rubyには`Dir`クラスに、ファイル名のワイルドカードパターンマッチングを行う`glob`メソッドが搭載されている。RantやRakeなどのライブラリの中には、グロブメソッドを搭載する`FileList`クラスを提供したり、同等な`FileList.[]`メソッドを利用するものもある。
- SQLiteには`GLOB`関数が搭載されている。
- Tclには本物の正規表現マッチング機能と、グロブと表現されることが多い、より限定された種類のパターンマッチングの2つが搭載されている。