グロブ
グロブ(英: 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シェル以外の環境におけるグロブの例を以下に示す:
- D言語では
std.path
モジュールにglobMatch
が搭載されている[12]。 - Node.jsには
minimatch
と呼ばれるライブラリが搭載されている。これはnpmやmicromatch
によって内部的に利用されており、より最適化された、正確で安全なグロブの実装である[13][14][15][16]。 - Goには
filepath
パッケージにGlob
関数が搭載されている[17]。 - Javaにはグロブパターンを操作するメソッドを含む、
Files
クラスが搭載されている[18]。 - Haskellにはメインモジュールである
System.FilePath.Glob
にGlob
パッケージが搭載されている。パターンの構文は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]。
関連項目
脚注
- ^ “First Edition Unix manual 'Miscellaneous' section (PDF)” (PDF). 2011年5月11日閲覧。
- ^ 1st Edition UNIX, code.google.com, src/cmd/glob.c
- ^ “The Open Group Base Specifications Issue 7 IEEE Std 1003.1, 2013 Edition, 2.13. Pattern Matching Notation”. 2017年7月29日閲覧。
- ^ “Linux Programmer's Manual, GLOB(7)”. 2017年7月29日閲覧。
- ^ “Pattern Matching”. Bash Reference Manual. 2017年7月29日閲覧。
- ^ “Supporting Wildcard Characters in Cmdlet Parameters”. 2017年7月29日閲覧。
- ^ “LIKE (Transact-SQL)”. 2017年7月29日閲覧。
- ^ "Advanced Bash-Scripting Guide, Chapter 19.2:Globbing" (Mendel Cooper, 2003) にはファイル名グロブパターン例の簡潔なセットが存在する。
- ^ “Wildcard Expansion”. Microsoft Developer Network (2013年). 2017年7月29日閲覧。
- ^ “Expanding Wildcard Arguments”. Microsoft Developer Network (2013年). 2017年7月29日閲覧。
- ^ “Supporting Wildcard Characters in Cmdlet Parameters”. Microsoft Developer Network (2013年). 2017年7月29日閲覧。
- ^ “std.path - D Programming Language - Digital Mars”. dlang.org. 2014年9月8日閲覧。
- ^ “isaacs/minimatch”. GitHub. 2016年8月10日閲覧。
- ^ “minimatch”. npm. 2016年8月10日閲覧。
- ^ “jonschlinkert/micromatch”. GitHub. 2017年4月4日閲覧。
- ^ “micromatch”. npm. 2017年4月4日閲覧。
- ^ “Package filepath - The Go Programming Language”. Golang.org. 2011年5月11日閲覧。
- ^ “File Operations”. Oracle. 2013年12月16日閲覧。
- ^ “Glob-0.7.4:Globbing library”. 2014年5月7日閲覧。
- ^ Contact details. “File::Glob - Perl extension for BSD glob routine”. perldoc.perl.org. 2011年5月11日閲覧。
- ^ “glob - Manual”. PHP (2011年5月6日). 2011年5月11日閲覧。
- ^ “10.7. glob — Unix style pathname pattern expansion — Python v2.7.1 documentation”. Docs.python.org. 2011年5月11日閲覧。
- ^ “10.8 fnmatch Unix filename pattern matching -- Python v2.7.7 documentation”. Docs.python.org. 2014年6月28日閲覧。
- ^ “'Globbing' library routine”. 2007年12月19日時点のオリジナルよりアーカイブ。2011年5月11日閲覧。
- ^ “Class:Dir”. Ruby-doc.org. 2011年5月11日閲覧。
- ^ “TCL glob manual page”. 2011年11月16日閲覧。