コンピュータ プログラミング
では、glob ( / ɡ l ɒ b / ) パターンは、ワイルドカード文字を使用してファイル名のセットを指定します。たとえば、Unix のBash シェルコマンドは、名前が で終わるすべてのファイルを現在のディレクトリからディレクトリに移動します。ここで、はワイルドカードであり、 はglob パターンです。ワイルドカードは、「空文字を含む任意の長さの文字列( Unix では 、 Windows ではパス区切り文字を除く)」を表します。
mv *.txt textfiles/.txttextfiles**.txt*/\
もう 1 つの一般的なワイルドカードは疑問符 ( ?) で、これは 1 つの文字を表します。たとえば、 は、名前が 1 つの文字で始まり、その後に が続くすべてのファイルを現在のディレクトリからディレクトリ に移動しますが、 は、名前が 2 つの文字で始まり、その後に が続くすべてのファイルに一致します。
mv ?.txt shorttextfiles/.txtshorttextfiles??.txt.txt
ファイル名のマッチングに加えて、glob は任意の文字列のマッチング (ワイルドカード マッチング) にも広く使用されています。この機能では、共通のインターフェイスが ですfnmatch。
起源

glob。所有者はdmr、つまりDennis Ritchieです。glob コマンドはglobalの略で、ベル研究所のUnixの初期のバージョンに由来します。[1] Unix の初期バージョン (第 1 版から第 6 版、1969 ~ 1975 年) のコマンド インタープリタは、コマンドへの引用符なしの引数内のワイルドカード文字を展開するために、別のプログラム/etc/globに依存していました。そのプログラムが展開を実行し、展開されたファイル パスのリストをコマンドの実行に渡しました。
globはもともとBプログラミング言語で書かれていました。これは、高級プログラミング言語で開発された最初の主流Unixソフトウェアでした。[2]その後、この機能はCライブラリ関数として提供され、シェルglob()などのプログラムで使用されました。これは通常、文字列が指定されたパターンに一致するかどうかをテストする関数に基づいて定義されます。この関数を使用するプログラムは、一連の文字列(通常はファイル名)を反復処理して、一致するものを判断できます。どちらの関数もPOSIXの一部です。関数は2001年以降POSIX.1で定義され、構文はPOSIX.2で定義されています。[3] [4]個別の一致関数を定義するというアイデアは、文字列をBourne Shellのglobと一致させるシンプルなライブラリで
あるwildmat (ワイルドカード一致)から始まりました。fnmatch()
伝統的に、glob は Unixドットファイル形式の隠しファイルには一致しません。これらに一致させるには、パターンを明示的に で始める必要があります.。たとえば、*はすべての表示可能なファイルに一致しますが、 は.*すべての隠しファイルと一致します。
構文
最も一般的なワイルドカードは*、、、?およびです[…]。
通常、パス区切り文字(/Linux/Unix、MacOSなど、または\Windows)は一致しません。Bashなどの一部のシェルには、ユーザーがこれを回避できる機能があります。[5]
Unixライク
Unix系システムでは*、?は上記のように定義されますが、さらに[…]2つの意味があります: [6] [7]
範囲には、定義済みの文字クラス、アクセント付き文字の等価クラス、入力が難しい文字の照合シンボルを含めることもできます。これらは、POSIX正規表現の括弧と一致するように定義されています。[6] [7]
UnixのグロブはPOSIXの伝統に従ってシェルによって処理されます。グロブはコマンドラインとシェルスクリプトのファイル名に対して提供されます。[8]シェルのPOSIX必須caseステートメントは、グロブパターンを使用したパターンマッチングを提供します。
一部のシェル ( C シェルやBashなど) は、代替または中括弧展開と呼ばれる追加の構文をサポートしています。これは glob 構文の一部ではないため、 では提供されませんcase。これは、グロブ前のコマンド ラインでのみ展開されます。
Bashシェルは以下の拡張機能もサポートしています: [9]
- 拡張グロビング (extglob): 括弧で囲まれたパターンの複数の出現を一致させるために他のパターンマッチング演算子を使用できるようにします。これは、通常の言語を記述するために欠落しているクリーネスターと交替を本質的に提供します。シェルオプションを設定することで有効にできます
extglob。このオプションは ksh93 から来ました。[10] GNU fnmatch と glob には同一の拡張機能があります。[3] - globstar:
**名前コンポーネントとして単独で使用することで、任意の数の非隠しディレクトリ層を再帰的に一致させることができます。[10] JavaScriptライブラリとPythonのglobでもサポートされています。
Windows と DOS

dir 1.0の glob パターンを使用したコマンド。オリジナルのDOS は、Intel の8088および8086プロセッサで動作するように設計されたCP/Mのクローンでした。Windows シェルは、DOS に従って、外部プログラムに渡される引数で glob 展開を伝統的に実行しません。シェルは、独自の組み込みコマンドで展開を使用できます。
- Windows PowerShellには、上記のように定義されたすべての共通構文が追加されていません。[11]
- COMMAND.COMとcmd.exe には、いくつかの制限はあるものの、一般的な構文のほとんどがあります。COMMAND.COM
[…]には と はなく、 はパターンの最後にのみ出現します。ファイル名拡張子の*区切りドットの直前を除き、パターンの途中に出現することはできません。
Windows および DOS プログラムは、argv 形式のパラメータの代わりに長いコマンドライン文字列を受け取り、分割、引用、または glob 展開を実行するのはプログラムの責任です。プログラムが自由に実行できるため、プログラム内でワイルドカードを記述する固定された方法は技術的にはありません。一般的な glob 展開には次の 2 つがあります。[12]
- Microsoft C ランタイム (msvcrt) コマンドライン エクスパンダーは、
?とのみをサポートします*。[13] ReactOS (crt/misc/getargs.c) とWine (msvcrt/data.c)の両方__getmainargsには、コア CRT 内に、内部で動作する関数である の互換性のあるオープン ソース実装が含まれています。 - Cygwinおよび MSYS のコマンドライン エクスパンダー。引数を分割した後、内部で
dcrt0.ccUnix スタイルのルーチンを使用します。glob()
インデックス サービスを含む Windows の他のほとんどの部分では、CMD にある MS-DOS スタイルのワイルドカードが使用されています。8.3 ファイル名時代の名残であるこの構文では、パターンとテキスト (ファイル名) 内のドットに特別な注意が払われます。内部的には、3 つの追加のワイルドカード文字 . <>". を使用して行われます。Windows API 側では、glob()に相当するものはFindFirstFileであり、fnmatch() はその基礎となるRtlIsNameInExpressionに対応します。[14] (fnmatch のもう 1 つの類似物はPathMatchSpecです。) 両方のオープン ソースの msvcrt エクスパンダーはFindFirstFileを使用するため、8.3 ファイル名の癖も適用されます。
構文
SQL演算子に はandLIKEと同等のものがありますが、 はありません。
?*[…]
標準 SQL では、演算子内で単純な文字列マッチングを行うために glob のような構文を使用しますLIKEが、SQL コミュニティでは「glob」という用語は一般的に使用されていません。パーセント記号 ( %) は 0 個以上の文字に一致し、アンダースコア ( _) は 1 文字に一致します。
SQLの多くの実装では、文字範囲( )とその否定、および正規表現の要素LIKEを組み込んだ、より豊富なパターンマッチング言語を可能にするために演算子を拡張しています。 [15][…]
正規表現と比較して
グロブには、表現の前の部分を複数回繰り返すことを可能にするクリーネスターの構文が含まれていないため、任意の有限アルファベット上の正規言語の完全なセットを記述できる正規表現とは見なされません。[16]
Glob は文字列全体の一致を試みます (たとえば、S*.DOCS.DOC および SA.DOC には一致しますが、POST.DOC や SURREY.DOCKS には一致しません)。一方、実装の詳細によっては、正規表現が部分文字列と一致する場合があります。
正規表現として実装する
文字列に対するグロブマッチング機能を提供する元の Mozillaプロキシ自動設定実装では、上記のように replace-as-RegExp 実装を使用します。このような例では、括弧構文が regex によってカバーされます。
Pythonのfnmatchはより複雑な手順を使ってパターンを正規表現に変換します。[17]
その他の実装
シェルでの使用以外にも、glob パターンはさまざまなプログラミング言語で使用され、主に人間の入力を処理するために使用されます。ファイルを返すための glob スタイルのインターフェイスや、文字列を一致させるための fnmatch スタイルのインターフェイスは、次のプログラミング言語で使用されています。
- C#にはNuGetを通じて利用できるライブラリが複数あります
Glob。[18]や[19DotNet.Glob] - Dは
globMatchモジュール内に関数を持っていますstd.path。[20] - JavaScriptにはnpm
minimatchが内部的に使用するというライブラリと、Babelやyarnで使用されている、より最適化され、正確で、安全なグロビング実装であると呼ばれるライブラリがある。[21] [22]micromatch - Goには
Globパッケージ内に関数がありますfilepath。[23] - Javaには
Filesglobパターンを操作するメソッドを含むクラスがあります。 [24] - Haskellに
Globはメインモジュールを含むパッケージがあります。パターン構文はZshSystem.FilePath.Globのサブセットに基づいています。与えられたパターンを最適化しようとし、単純な文字ごとのマッチングよりも著しく高速になるはずです。[25] - Perlには関数(ラリー・ウォールの著書「プログラミングPerl
glob」で説明されている)とBSDのglobルーチンを模倣したGlob拡張機能の両方があります。 [26] Perlの山括弧もglobに使用できます。<*.log> - PHPには関数があります
glob。[27] - Pythonの
glob標準ライブラリには、ファイル名に対してワイルドカードパターンマッチングを実行するモジュール[28]と、fnmatch同じワイルドカードパターンに基づいて文字列をマッチングしたりリストをフィルタリングしたりする機能を備えたモジュールがあります。 [17] Pythonプログラミング言語の作者であるGuido van Rossumは、 1986年にBSD Unixglobにルーチンを書いて寄稿しました。 [29]以前のBSDリリースでは、 exプログラムやftpプログラムなどでの実装がありました。glob - Rubyには、ファイル名に対してワイルドカードパターンマッチングを実行するクラス
globのメソッドがあります。 [30] RantやRakeなどのいくつかのライブラリは、globメソッドを持つクラスを提供するか、または同じメソッドを使用します。DirFileListFileList.[] - Rustにはglobパターンにマッチできるライブラリが複数ある。[31]
- SQLite には関数があります
GLOB。 - Tclにはグロビング機能が含まれています。[32]
参照
参考文献
- ^ 「初版 Unix マニュアル「その他」セクション (PDF)」(PDF)。2000 年 8 月 29 日時点のオリジナル(PDF)からアーカイブ。2011 年 5 月 11 日に取得。
- ^ McIlroy, MD (1987). A Research Unix reader: annotated excerpts from the Programmer's Manual, 1971–1986 (PDF) (技術レポート). CSTR. Bell Labs. 139.
- ^ ab – Linuxプログラマーズマニュアル– ライブラリ関数
- ^ – Linuxプログラマーズマニュアル– ライブラリ関数
- ^ https://www.gnu.org/software/bash/manual/bash.html#Pattern-Matching 2018-03-15 に Wayback MachineにアーカイブBash リファレンス マニュアル
- ^ ab 「The Open Group Base Specifications Issue 7 IEEE Std 1003.1, 2013 Edition, 2.13. パターンマッチング表記法」。2014年4月27日時点のオリジナルよりアーカイブ。2015年10月26日閲覧。
- ^ ab "Linux Programmer's Manual, GLOB(7)". 2015年10月31日時点のオリジナルよりアーカイブ。2015年10月26日閲覧。
- ^ 『Advanced Bash-Scripting Guide, Chapter 19.2: Globbing』(Mendel Cooper、2003) には、ファイル名のグロビング パターンの簡潔な例が記載されています。
- ^ 「Bash globs」。greg's bash knowledgebase。2019年11月18日時点のオリジナルよりアーカイブ。2019年11月25日閲覧。
- ^ ab 「パターンマッチング」。Bashリファレンスマニュアル。2016 年 2 月 11 日のオリジナルからアーカイブ。2016年 1 月 11 日閲覧。
- ^ 「コマンドレット パラメーターでのワイルドカード文字のサポート」。Microsoft。Microsoft Developer Network。2023 年 12 月 18 日。
- ^ 「ワイルドカード拡張」。Microsoft Developer Network。2013 年。2014 年 8 月 22 日時点のオリジナルよりアーカイブ。2013年 10 月 16 日閲覧。
- ^ 「ワイルドカードの拡張」。docs.microsoft.com . 2022-02-08。
- ^ Windows のワイルドカード Archived 2019-12-24 at the Wayback Machine . MSDN Devblog.
- ^ "LIKE (Transact-SQL)". 2023-05-23. 2017-08-02 時点のオリジナルよりアーカイブ。2017-08-01閲覧。
- ^ ホップクロフト、ジョン E.、モトワニ、ラジーブ、ウルマン、ジェフリー D. (2000)。オートマトン理論、言語、計算入門(第 2 版)。アディソン・ウェズリー。
- ^ ab "Lib/fnmatch.py". Python. 2021-01-20. 2021-11-10時点のオリジナルよりアーカイブ。 2021-11-10に取得。
- ^ “kthompson/glob”. GitHub . 2020年10月26日時点のオリジナルよりアーカイブ。2020年11月6日閲覧。
- ^ "dazinator/dotnet.glob". GitHub . 2022-06-22 のオリジナルよりアーカイブ。2022-06-22に取得。
- ^ 「std.path - Dプログラミング言語 - Digital Mars」。dlang.org。2014年9月8日時点のオリジナルよりアーカイブ。2014年9月8日閲覧。
- ^ "isaacs/minimatch". GitHub . 2016年7月28日時点のオリジナルよりアーカイブ。2016年8月10日閲覧。
- ^ "jonschlinkert/micromatch". GitHub . 2016年2月11日時点のオリジナルよりアーカイブ。2017年4月4日閲覧。
- ^ 「パッケージファイルパス - Goプログラミング言語」。Golang.org。2011年5月25日時点のオリジナルよりアーカイブ。2011年5月11日閲覧。
- ^ 「ファイル操作」。Oracle。2013年9月20日時点のオリジナルよりアーカイブ。2013年12月16日閲覧。
- ^ 「Glob-0.7.4: Globbing library」。2014年5月8日時点のオリジナルよりアーカイブ。2014年5月7日閲覧。
- ^ 「File::Glob - BSD glob ルーチンの Perl 拡張」 perldoc.perl.org . 2011 年 5 月 11 日閲覧。
- ^ "glob - マニュアル". PHP. 2011-05-06. 2017-11-13 にオリジナルからアーカイブ。2011-05-11に取得。
- ^ 「10.7. glob — Unix スタイルのパス名パターン拡張 — Python v2.7.1 ドキュメント」。Docs.python.org。2011 年 5 月 16 日時点のオリジナルよりアーカイブ。2011 年5 月 11 日閲覧。
- ^ 「'Globbing' ライブラリ ルーチン」。2007 年 12 月 19 日のオリジナルからアーカイブ。2011 年 5 月 11 日閲覧。
- ^ 「Class: Dir」。Ruby-doc.org。2011年5月15日時点のオリジナルよりアーカイブ。2011年5月11日閲覧。
- ^ “#glob - Lib.rs”. lib.rs. 2021年11月12日時点のオリジナルよりアーカイブ。2021年11月12日閲覧。
- ^ 「TCL glob マニュアル ページ」。2011 年 12 月 8 日にオリジナルからアーカイブ。2011年 11 月 16 日に取得。
