グロブ

グロブ: 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
[c1c2cN] 括弧内で列挙されたどれか1文字にマッチ 営業実績[123] 営業実績1営業実績2営業実績3 営業実績営業実績4営業実績12
[cmin-cmax] 括弧内で指定された範囲内の1文字にマッチ 営業実績[0-9] 営業実績1営業実績3営業実績4営業実績5営業実績9 営業実績営業実績10営業実績B営業実績2019

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

UNIX

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

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

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

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

Windows PowerShell

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

Windows

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

SQL

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

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

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

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

正規表現との比較

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

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

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

実装

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

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

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

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

関連項目

脚注

  1. ^ First Edition Unix manual 'Miscellaneous' section (PDF)” (PDF). 2011年5月11日閲覧。
  2. ^ 1st Edition UNIX, code.google.com, src/cmd/glob.c, http://unix-jun72.googlecode.com/svn/trunk/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”. 2011年11月16日閲覧。