グロブ

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

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

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シェルは、コマンドラインやシェルスクリプトにおいてファイル名のグロブを提供する"Advanced Bash-Scripting Guide, Chapter 19.2:Globbing" (Mendel Cooper, 2003) にはファイル名グロブパターン例の簡潔なセットが存在する。。

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つが搭載されている。

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

脚注

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