グロブ

出典: フリー百科事典『ウィキペディア(Wikipedia)』
ナビゲーションに移動 検索に移動

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

起源[編集]

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

構文[編集]

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

ワイルドカード 解説 マッチする文字列 マッチしない文字列
* 0文字以上の任意の文字列にマッチ Law* LawLaws、またはLawyer GrokLawLa、またはaw
*Law* LawGrokLaw、またはLawyer Laaw
? 任意の1文字にマッチ ?at CatcatBat、またはbat at
[abc] 括弧内で指定された1文字にマッチ [CB]at Cat、またはBat cat、またはbat
[a-z] 括弧内で指定された範囲内の1文字にマッチ Letter[0-9] Letter0Letter1Letter2よりLetter9まで LettersLetter、またはLetter10

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

UNIX[編集]

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

ワイルドカード 解説 マッチする文字列 マッチしない文字列
[!abc] 括弧内で指定されていない1文字にマッチ [!C]at Batbat、またはcat Cat
[!a-z] 括弧内で指定されていない範囲内の1文字にマッチ Letter[!3-5] Letter1Letter2Letter6よりLetter9まで、さらにLetterxなど Letter3Letter4Letter5、またはLetterxx

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 predicate 中のパターンには、?*に相当する表現が使える。[…]に相当する表現は存在しない。

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

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

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

正規表現との比較[編集]

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

通常のワイルドカード 相当する正規表現
? .
* .*

グロブは文字列全体とのマッチを試みる(例えば、S*.DOCはS.DOCやSA.DOCにマッチするが、POST.DOCやSURREY.DOCKSにはマッチしない)。

実装[編集]

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日閲覧。