
glob。所有者はDennis MacAlistair Ritchiedmrの略です。glob() ( / ɡ l ɒ b / ) は、 POSIX C の関数で、グロビングと呼ばれる処理に使用されます。グロビングとは、ファイルシステムのディレクトリ内の名前に対してパターンマッチングを行う典型的な処理であり、名前のパターンを、そのパターンに一致する名前のリストに展開します。現在では、グロビングはファイルシステム名のリストへの展開だけでなく、任意の文字列に対するパターンマッチングを指す場合もありますがglob()、この用語の本来の意味は依然として広く使われています。
このglob()機能とその基盤となるgmatch()機能は、 1970年代初頭にベル研究所で、オリジナルのAT&T UNIX自体と共に開発され、UNIXコマンドラインユーティリティの構文、ひいては現代のそれらの再実装に大きな影響を与えた。
元々は、 1970年代初頭にオリジナルのUnixと並行して開発されたベル研究所の社内ユーティリティで使用されていたコードから派生したものでしたglob()。これらのユーティリティの中には、とと呼ばれる2つのコマンドラインツールもありました。それぞれ、一致するファイル名のリストを他のコマンドラインツールに渡すために使用でき、これらは後にととして形式化されたバックエンドコードを共有していました。デフォルトでシェルステートメントレベルのグロビングが一般的になったのは、 1978年にUnixシェルの第7版にグロビング機能が「組み込み」として統合された後のことです。グロビングを無効にする(つまり、リテラルの「ファイル」モードに戻す) Unixシェルの-fオプションは、同じバージョンで登場しました。gmatch()globfindglob()gmatch()
POSIX.2 (IEEE Std 1003.2)で標準化されたグロブパターンの量指定子は2 つのグループに分類され、ディレクトリ エントリだけでなく、任意の文字シーケンス (「文字列」) に適用できます。
?(括弧内以外)は、任意の文字にちょうど1回一致します。*(括弧で囲まれていない)は、0 文字以上の文字列に一致します。[...]括弧内の最初の文字が「!」でない場合、括弧で指定された文字の中から任意の1文字に一致します。括弧内の最初の文字が「!」の場合、括弧で指定された文字の中に含まれない[!...]任意の1文字に一致します。[abc])または範囲([a-c])である場合もあれば、文字クラス(内側の括弧がクラス名の一部である場合など)を示す場合もあります。POSIX は、元々は正規表現[[:space:]]から派生したマルチレンジ([a-c0-3])のサポートを義務付けていません。ベル研究所の UNIXの再実装が増えるにつれて、ベル研究所の libc とシェルの再実装も増え、それに伴ってグロビングglob()も増えました。今日では、グロビングはPOSIX.2仕様で標準化されており、AT&T Bourne シェル互換のKorn シェル (ksh)、Z シェル (zsh)、Almquist シェル (ash)とその派生版や、 busybox、toybox、GNU bash、Debian dashなどの再実装を含む、すべての Unix ライクなlibc エコシステムとシェルに不可欠な部分となっています。glob()
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 のグロブに対して文字列をマッチさせるシンプルなライブラリであるwildmat (ワイルドカードマッチ) から始まりました。fnmatch()
従来、グロブパターンはUnixドットファイル形式の隠しファイルには一致しません。それらに一致させるには、パターンを明示的にで始める必要があります.。たとえば、*はすべての可視ファイルに一致し、は.*すべての隠しファイルに一致します。
最も一般的なワイルドカードは*、、、?およびです[…]。
通常、パス区切り文字(/Linux/Unix、MacOSなど、または\Windowsの場合)は一致しません。Unixシェルなどの一部のシェルには、ユーザーがこれを回避できる機能があります。[ 5 ]
Unix ライクなシステムでは*、?は上記のように定義されますが、には[…]さらに 2 つの意味があります: [ 6 ] [ 7 ]
範囲には、定義済みの文字クラス、アクセント付き文字の等価クラス、入力しにくい文字の照合記号を含めることもできます。これらは、POSIX 正規表現の括弧に一致するように定義されています。[ 6 ] [ 7 ]
Unix のグロビングは POSIX の慣例に従ってシェルによって処理されます。グロビングはコマンドラインとシェルスクリプトのファイル名に対して提供されます。[ 8 ]シェルのPOSIX で義務付けられているcaseステートメントは、グロブパターンを使用したパターンマッチングを提供します。
CシェルやBashなどの一部のシェルは、選択式または括弧展開と呼ばれる追加の構文をサポートしています。これはグロブ構文の一部ではないため、には提供されていませんcase。グロビングの前にコマンドラインでのみ展開されます。
Bashシェルは以下の拡張機能もサポートしています。[ 9 ]
extglob。このオプションは ksh93 から来ています。[ 10 ] GNU fnmatch と glob には同じ拡張機能があります。[ 3 ]**名前コンポーネントとして単独で、非非表示ディレクトリの任意の階層を再帰的に一致させることができます。[ 10 ] JavaScriptライブラリとPythonのglobでもサポートされています。
dir 1.0におけるグロブパターンを使用したコマンド。オリジナルのDOSは、 Intelの8088および8086プロセッサ上で動作するように設計されたCP/Mのクローンでした。Windowsシェルは、DOSに倣い、外部プログラムに渡される引数に対してグロブ展開を従来は行いません。ただし、シェルは独自の組み込みコマンドに対して展開を行う場合があります。
[…]、いくつかの制限はあるものの、共通構文のほとんどを備えています。COMMAND.COMにはがなく、はパターンの末尾にのみ出現できます。ファイル名拡張子*区切り文字のドットの直前を除き、パターンの途中に出現することはできません。Windows および DOS プログラムは、argv スタイルのパラメータの代わりに長いコマンドライン文字列を受け取り、分割、引用、またはグロブ展開を実行する責任があります。プログラムではワイルドカードを記述する固定の方法はありません。ワイルドカードは自由に動作できるためです。一般的な 2 つのグロブ展開器には次のものがあります。[ 12 ]
?とのみをサポートしています*。[ 13 ] ReactOS ( crt/misc/getargs.c) とWine ( )はどちらも、コア CRT に、内部で動作する関数msvcrt/data.cである の互換性のあるオープンソース実装を含んでいます。__getmainargsdcrt0.ccglob()インデックスサービスを含む Windows の他のほとんどの部分は、CMD にある MS-DOS スタイルのワイルドカードを使用します。8.3 ファイル名時代の名残であるこの構文は、パターンとテキスト (ファイル名) 内のドットに特に注意を払います。内部的には、3 つの追加のワイルドカード文字を使用してこれを実行します。Windows <>"API 側では、glob()同等のものは でありFindFirstFile()、fnmatch()その基となる に対応しますRtlIsNameInExpression()。[ 14 ] (別のfnmatch()類似物は ですPathMatchSpec()。) オープンソースの msvcrt エキスパンダーはどちらも を使用するFindFirstFile()ため、8.3 ファイル名の癖がそれらにも適用されます。
SQL演算子には、LIKEとに相当するものがあります?が*、はありません[…]。
標準SQLでは、演算子で単純な文字列マッチングを行う際にグロブに似た構文を使用しますLIKEが、「グロブ」という用語はSQLコミュニティでは一般的に使用されません。パーセント記号(% %)は0文字以上、アンダースコア(アンダースコア_)は1文字に一致します。
SQLの多くの実装では、文字範囲( )、その否定、正規表現の要素LIKEを取り入れた、よりリッチなパターンマッチング言語を可能にするために演算子が拡張されています。 [ 15 ][…]
グロブには、式の前の部分を複数回繰り返すことを可能にするクリーネスターの構文が含まれていないため、任意の有限アルファベット上の正規言語の完全なセットを記述できる正規表現とはみなされません。[ 16 ]
グロブは文字列全体に一致しようとします(たとえば、S.DOCとSA.DOCS*.DOCには一致しますが、POST.DOCやSURREY.DOCKSには一致しません)。一方、正規表現は実装の詳細によっては部分文字列に一致する場合があります。
文字列に対してグロブマッチング機能を提供するオリジナルのMozillaプロキシ自動設定実装では、上記のような正規表現による置換実装が用いられています。このような例では、括弧構文が正規表現でカバーされています。
Pythonのfnmatchは、パターンを正規表現に変換するために、より複雑な手順を使用します。[ 17 ]
シェルでの利用以外にも、グロブパターンは様々なプログラミング言語で、主に人間が入力したデータを処理するために利用されています。ファイルを返すためのグロブスタイルのインターフェースや、文字列を照合するためのfnmatchスタイルのインターフェースは、以下のプログラミング言語に存在します。
<glob.h>から を含めて使用できます。 ::glob()std::filesystem::directory_iteratorとを使用して近似することができますstd::regex_match()。Poco::GlobMicrosoft.Extensions.FileSystemGlobbing、[ 19 ]クラスが含まれていますMicrosoft.Extensions.FileSystemGlobbing.Matcher。[ 20 ]std.path.globMatch()。[ 23 ]filepath.Glob()。[ 24 ]java.nio.file.Files、グロブパターンを操作するためのメソッドなどを持つクラス[ 25 ]を提供し、を返します。クラスともグロブパターンのマッチングに使用されます。Files.newDirectoryStream(Pathdir,Stringglob)DirectoryStream<Path>java.nio.file.FileSystemsjava.nio.file.PathMatcherGlobはメインモジュールを含むパッケージがあります。パターン構文はZshSystem.FilePath.Globのサブセットに基づいています。指定されたパターンを最適化しようとし、単純な文字ごとのマッチングよりも明らかに高速になるはずです。[ 26 ]globはモジュール内に関数がありますnode:fs。[ 27 ]glob、( Larry Wallの著書『Programming Perl 』で説明されているように)関数と、BSDのglobルーチンを模倣するGlob拡張機能の両方があります。 [ 28 ] Perlの山括弧もglobに使用できます。<*.log>glob。[ 29 ]globファイル名に対してワイルドカード パターン マッチングを実行するモジュールが標準ライブラリに用意されており、[ 30 ]また、fnmatch同じワイルドカード パターンに基づいて文字列をマッチングしたりリストをフィルタリングしたりする関数を含むモジュールもあります。[ 17 ] Python プログラミング言語の作者であるGuido van Rossumは、 1986 年にBSD Unixglobにルーチンを作成して提供しました。 [ 31 ]以前の BSD リリースでは、exプログラムやftpプログラムなどに、以前に実装された例がありました。globglobは、ファイル名に対してワイルドカードパターンマッチングを実行するクラスのメソッドがありますDir。[ 32 ] RantやRakeなどのいくつかのライブラリは、FileListglobメソッドを持つクラスを提供するか、またはメソッドをFileList.[]同じように使用します。globを持つクレートです[ 34 ]glob()。GLOB。