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

起源

UNIXの初期バージョン(1969年の「1st」版から1975年の「6th」版まで)におけるコマンドインタプリタでは、コマンドへの引用符で囲まれていない引数内に含まれるワイルドカードの展開は、インタプリタとは独立した /etc/glob というプログラムに依存していた[1]。このプログラムが展開を行い、実行するコマンドへ展開されたファイルパスリストを提供した。この名前はグローバル・コマンドの略語である[2]。後にこれは機能的に 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つが追加されている[3][4]:

ワイルドカード 解説 使用例
グロブ表現 マッチする文字列の例 マッチしない文字列の例
[!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シェルオプションをセットすることで有効になる[5]。

Windows PowerShell

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

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][7]である。

正規表現との比較

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

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

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

実装

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

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

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

関連項目

脚注

  1. ↑ “First Edition Unix manual 'Miscellaneous' section (PDF)” (PDF). 2011年5月11日閲覧。
  2. ↑ 1st Edition UNIX, code.google.com, src/cmd/glob.c
  3. ↑ “The Open Group Base Specifications Issue 7 IEEE Std 1003.1, 2013 Edition, 2.13. Pattern Matching Notation”. 2017年7月29日閲覧。
  4. ↑ “Linux Programmer's Manual, GLOB(7)”. 2017年7月29日閲覧。
  5. ↑ “Pattern Matching”. Bash Reference Manual. 2017年7月29日閲覧。
  6. ↑ “Supporting Wildcard Characters in Cmdlet Parameters”. 2017年7月29日閲覧。
  7. ↑ “LIKE (Transact-SQL)”. 2017年7月29日閲覧。
  8. ↑ "Advanced Bash-Scripting Guide, Chapter 19.2:Globbing" (Mendel Cooper, 2003) にはファイル名グロブパターン例の簡潔なセットが存在する。
  9. ↑ “Wildcard Expansion”. Microsoft Developer Network (2013年). 2017年7月29日閲覧。
  10. ↑ “Expanding Wildcard Arguments”. Microsoft Developer Network (2013年). 2017年7月29日閲覧。
  11. ↑ “Supporting Wildcard Characters in Cmdlet Parameters”. Microsoft Developer Network (2013年). 2017年7月29日閲覧。
  12. ↑ “std.path - D Programming Language - Digital Mars”. dlang.org. 2014年9月8日閲覧。
  13. ↑ “isaacs/minimatch”. GitHub. 2016年8月10日閲覧。
  14. ↑ “minimatch”. npm. 2016年8月10日閲覧。
  15. ↑ “jonschlinkert/micromatch”. GitHub. 2017年4月4日閲覧。
  16. ↑ “micromatch”. npm. 2017年4月4日閲覧。
  17. ↑ “Package filepath - The Go Programming Language”. Golang.org. 2011年5月11日閲覧。
  18. ↑ “File Operations”. Oracle. 2013年12月16日閲覧。
  19. ↑ “Glob-0.7.4:Globbing library”. 2014年5月7日閲覧。
  20. ↑ Contact details. “File::Glob - Perl extension for BSD glob routine”. perldoc.perl.org. 2011年5月11日閲覧。
  21. ↑ “glob - Manual”. PHP (2011年5月6日). 2011年5月11日閲覧。
  22. ↑ “10.7. glob — Unix style pathname pattern expansion — Python v2.7.1 documentation”. Docs.python.org. 2011年5月11日閲覧。
  23. ↑ “10.8 fnmatch Unix filename pattern matching -- Python v2.7.7 documentation”. Docs.python.org. 2014年6月28日閲覧。
  24. ↑ “'Globbing' library routine”. 2007年12月19日時点のオリジナルよりアーカイブ。2011年5月11日閲覧。
  25. ↑ “Class:Dir”. Ruby-doc.org. 2011年5月11日閲覧。
  26. ↑ “TCL glob manual page”. 16 November 2011閲覧。
⌬ Phoenix Mesh CID: 未登録 IPFS未登録 📡 0ピア N=1 CRITICAL PQS B62