グロブ

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

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

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

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

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

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

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

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

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

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

標準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関数（ラリー・ウォールの著書であるで議論されている）と、BSDのグロブルーチンを模倣するGlob拡張の2つが搭載されている。同様にして<*.log>のように、Perlの山括弧もグロブに利用できる。
PHPにはglob関数が搭載されている。
Pythonには標準ライブラリに、ファイル名に対してワイルドカードパターンマッチングを行うglobモジュールが搭載され、さらに文字列をマッチしたり、ファイル名に対するものと同じワイルドカードパターンに基づいて、文字列やフィルタリングリストとのマッチを行うための関数を含むfnmatchモジュールが搭載されている。Pythonプログラミング言語の著者であるグイド・ヴァンロッサムは、1986年にBSD UNIXのglobルーチンを書いて寄与した。彼による以前のglobルーチンは、以前のBSDリリースに含まれていたとftpプログラムなどに含まれていた。
RubyにはDirクラスに、ファイル名のワイルドカードパターンマッチングを行うglobメソッドが搭載されている。RantやRakeなどのライブラリの中には、グロブメソッドを搭載するFileListクラスを提供したり、同等なFileList.[]メソッドを利用するものもある。
SQLiteにはGLOB関数が搭載されている。
Tclには本物の正規表現マッチング機能と、グロブと表現されることが多い、より限定された種類のパターンマッチングの2つが搭載されている。

関連項目
正規表現
ワイルドカード (情報処理)

脚注

構文解析 (プログラミング)
検索