グロブ(プログラミング)

ウィキペディアから、無料の百科事典
ナビゲーションにジャンプ 検索にジャンプ

コンピュータプログラミングで はglob/ ɡlɑːb / )パターンはワイルドカード文字を使用してファイル名のセットを指定しますたとえば、Unix Bashシェルコマンドは、名前がで終わるすべてのファイルを現在のディレクトリからディレクトリにmv *.txt textfiles/移動します( ) ここで、は「任意の文字列」を表すワイルドカードあり、グロブパターンです。もう1つの一般的なワイルドカードは、 1つの文字を表す疑問符( )です。たとえば、1文字の後に続く名前のすべてのファイルを移動しますmv.txttextfiles**.txt?mv ?.txt shorttextfiles/.txt現在のディレクトリからディレクトリへshorttextfiles??.txt名前が2文字の後に。が続くすべてのファイルに一致します.txt

ファイル名の照合に加えて、globは任意の文字列の照合(ワイルドカード照合)にも広く使用されていますこの容量では、一般的なインターフェイスはfnmatchです。

オリジン

元の1971年のUnixリファレンスページのスクリーンショットglob–所有者は、 DennisRitchiedmrの略です

グローバルの略であるglobコマンドは、ベル研究所のUnixの初期バージョンに由来します。[1] Unixの初期バージョン(第1版から第6版、1969年から1975年)のコマンドインタープリターは、コマンドへの引用符で囲まれていない引数のワイルドカード文字を展開するために別のプログラムに依存していました: / etc/globそのプログラムは拡張を実行し、実行のためにファイルパスの拡張リストをコマンドに提供しました。

GlobはもともとBプログラミング言語で書かれていました。これは、高級プログラミング言語で開発された最初のメインラインUnixソフトウェアでした[2]後に、この機能は、シェルなどのプログラムで使用されるCライブラリ関数として提供されました。これは通常、文字列が特定のパターンに一致するかどうかをテストするという名前の関数に基づいて定義されます。この関数を使用するプログラムは、一連の文字列(通常はファイル名)を反復処理して、一致する文字列を判別できます。どちらの関数もPOSIXの一部です。2001年以降にPOSIX.1で定義された関数と、POSIX.2で定義された構文です。[3] [4]glob()fnmatch()別の一致関数を定義するというアイデアは、文字列をBourne Shellグロブと照合するための単純なライブラリであるwildmat(ワイルドカード一致)から始まりました。

従来、グロブはUnixドットファイルの形式の隠しファイルとは一致しませんそれらに一致させるには、パターンは明示的に。で始まる必要があり.ます。たとえば、*すべての表示ファイルに.*一致し、すべての隠しファイルに一致します。

構文

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

ワイルドカード 説明 一致する 一致していません
* なしを含む任意の数の文字に一致します Law* Law、、LawsまたはLawyer GrokLaw、、Laまたはaw
*Law* Law、、、GrokLawまたはLawyer La、 またaw
? 任意の1文字に一致します ?at Cat、、またはcat_Batbat at
[abc] 角かっこで指定された1文字に一致します [CB]at CatまたBat catbatまたはCBat
[a-z] 角かっこで指定された(ロケールに依存する)範囲の1文字に一致します Letter[0-9] Letter0、、までLetter1_Letter2Letter9 LettersLetterまたはLetter10

通常、パス区切り文字(/Linux / Unix、MacOSなどまたは\Windowsの場合)は一致しません。Bashなどの一部のシェルには、ユーザーがこれを回避できる機能があります。[5]

Unixライク

Unixライクなシステム*?は、は上記のように定義されますが、 2[…]つの追加の意味があります。[6] [7]

ワイルドカード 説明 一致する 一致していません
[!abc] 角かっこで囲まれていない1文字に一致します [!C]at Bat、、batまたはcat Cat
[!a-z] 角かっこで指定された範囲外の1文字に一致します Letter[!3-5] Letter1、、までなどLetter2_Letter6Letter9Letterx Letter3、、またはLetter4_Letter5Letterxx

範囲には、事前定義された文字クラス、アクセント付き文字の同値類、および入力が難しい文字の照合記号を含めることもできます。これらは、POSIX正規表現の角かっこと一致するように定義されています。[6] [7]

Unixグロブは、POSIXの伝統に従ってシェルによって処理されます。Globbingは、コマンドラインのファイル名とシェルスクリプトで提供されます。[8]シェルのPOSIXで義務付けられcaseたステートメントは、globパターンを使用したパターンマッチングを提供します。

一部のシェル(CシェルBashなど)は、交互または中括弧拡張と呼ばれる追加の構文をサポートしていますこれはglob構文の一部ではないため、では提供されていませんcaseグロブする前にコマンドラインでのみ展開されます。

Bashシェルは次の拡張機能もサポートしています。[9]

  • 拡張グロブ(extglob):他のパターンマッチング演算子を使用して、括弧で囲まれたパターンの複数のオカレンスをマッチングできるようにします。これにより、基本的に、欠落しているクリーネ閉包と正規言語を記述するための代替が提供されます。extglobシェルオプションを設定することで有効にできます。このオプションはksh93から来ました。[10] GNUfnmatchとglobの拡張子は同じです。[3]
  • globstar:**名前コンポーネントとしてそれ自体で、隠されていないディレクトリの任意の数のレイヤーに再帰的に一致することを許可します。[10] JSライブラリとPythonのglobでもサポートされています。

WindowsとDOS

IBMdir PCDOS1.0のglobパターンを使用したコマンド

オリジナルのDOSは、 Intelの8088および8086プロセッサで動作するように設計されたCP/Mのクローンでした。DOSに続くWindowsシェルは、従来、外部プログラムに渡される引数でglob拡張を実行しません。シェルは、独自の組み込みコマンドに拡張を使用する場合があります。

  • Windows PowerShellには、上記のように定義されたすべての一般的な構文が追加なしで含まれています。[11]
  • COMMAND.COMcmd.exeには、いくつかの制限がある一般的な構文のほとんどがあります。COMMAND.COMにはありません。また[…]、COMMAND.COMの*場合、パターンの最後にのみ表示される場合があります。ファイル名拡張子の区切り記号の直前を除いて、パターンの途中に表示することはできません。

WindowsおよびDOSプログラムは、argvスタイルのパラメーターの代わりに長いコマンドライン文字列を受け取ります。分割、引用符、またはglob拡張を実行するのはそれらの責任です。ワイルドカードは自由に実行できるため、プログラムでワイルドカードを記述するための固定された方法は技術的にありません。2つの一般的なグロブエキスパンダーは次のとおりです。[12]

  • ?およびのみをサポートするMicrosoftCランタイム(msvcrt)コマンドラインエクスパンダ*[13] ReactOS(crt / misc / getargs.c)とWine(msvcrt / data.c)はどちらも、コアCRTに、内部で動作する関数の互換性のあるオープンソース実装を含ん__getmainargsいます。
  • CygwinおよびMSYSコマンドラインエクスパンダ。引数を分割した後dcrt0.cc、内部でunixスタイルのglob()ルーチンを使用します。

インデックスサービスを含むWindowsの他のほとんどの部分は、CMDにあるMS-DOSスタイルのワイルドカードを使用します。8.3ファイル名の時代の遺物であるこの構文は、パターン内のドットとテキスト(ファイル名)に特別な注意を払っています。内部的には、これは3つの追加のワイルドカード文字を使用して行われ<>"ます。Windows API側では、同等のglob()はFindFirstFileであり、fnmatch()はその基になるRtlIsNameInExpressionに対応します。[14](別のfnmatchアナログはPathMatchSpecです。)両方のオープンソースmsvcrtエクスパンダーはFindFirstFileを使用するため、8.3ファイル名の癖も適用されます。

SQL

SQL LIKE演算子には、と同等のがありますが、は?あり*ません[…]

一般的なワイルドカード SQLワイルドカード 説明
? _ 任意の1文字に一致します
* % なしを含む任意の数の文字に一致します

標準SQLは、LIKE演算子での単純な文字列照合にglobのような構文を使用しますが、「glob」という用語はSQLコミュニティでは一般的に使用されていません。パーセント記号(%)は0個以上の文字に一致し、アンダースコア(_)は正確に1文字に一致します。

SQLの多くの実装では、演算子が拡張され、文字範囲( )、その否定、および正規表現の要素をLIKE組み込んだ、より豊富なパターンマッチング言語が可能になりました。[15][…]

正規表現との比較

グロブには、式の前の部分を複数回繰り返すことができるクリーネ閉包の構文は含まれていません。したがって、これらは正規表現とは見なされません。正規表現は、任意の有限アルファベットで正規言語の完全なセットを記述することができます。[16]

一般的なワイルドカード 同等の正規表現
? .
* .*

Globsは文字列全体に一致しようとしますが(たとえば、 S.DOCとSA.DOCにはS*.DOC一致しますが、POST.DOCやSURREY.DOCKSには一致しません)、実装の詳細によっては、正規表現が部分文字列に一致する場合があります。

正規表現としての実装

文字列にglobマッチング関数を提供する元のMozillaプロキシ自動設定実装は、上記のようにreplace-as-RegExp実装を使用します。このような例では、ブラケット構文は正規表現でカバーされています。

Pythonのfnmatchは、より複雑な手順を使用して、パターンを正規表現に変換します。[17]

その他の実装

グロブパターンは、シェルでの使用だけでなく、主に人間の入力を処理するために、さまざまなプログラミング言語でも使用されます。ファイルを返すためのglobスタイルのインターフェース、または文字列を照合するためのfnmatchスタイルのインターフェースは、次のプログラミング言語にあります。

  • C#には、 NuGetGlobを使用してインストールできるというライブラリがあります[18]
  • DはモジュールglobMatch内に機能がありstd.pathます。[19]
  • JavaScriptには、 npmによってminimatch内部的に使用されると呼ばれるライブラリがあります。これは、 Babelとyarnによって使用される、より最適化された、正確で安全なグロブの実装です。[20] [21]micromatch
  • GoにはパッケージにGlob機能があります。[22]filepath
  • Javaには、Filesglobパターンを操作するメソッドを含むクラスがあります。[23]
  • Haskellにはメインモジュールを含むGlobパッケージがありますSystem.FilePath.Globパターン構文は、 Zshのサブセットに基づいています与えられたパターンを最適化しようとし、ナイーブな文字ごとのマッチャーよりも著しく高速である必要があります。[24]
  • Perlには、glob関数(LarryWallの著書ProgrammingPerlで説明されているBSDglobルーチンを模倣するGlob拡張機能の両方があります。[25] Perlの山かっこは、グロブにも使用できます<*.log>
  • PHPにはglob機能があります。[26]
  • Pythonには、globファイル名に対してワイルドカードパターンマッチングを実行するモジュール[27]と、fnmatchこれらの同じワイルドカードパターンに基づいて文字列またはフィルタリングリストを照合するための関数を備えたモジュールがあります。[17] Pythonプログラミング言語の作者であるGuidovanRossumは、1986年にBSD Unixglobにルーチンを作成し、寄稿しました。 [28] BSDの以前のリリースのexおよびftpプログラムなど以前の実装がありました。 glob
  • Rubyには、ファイル名に対してワイルドカードパターンマッチングを実行globするクラスのメソッドがあります。[29] RantやRakeなどのいくつかのライブラリは、globメソッドを持つクラスを提供するか、メソッドを同じように使用します。DirFileListFileList.[]
  • Rustには、globパターンに一致する複数のライブラリがあります。[30]
  • SQLiteにはGLOB機能があります。
  • Tclにはグロブ機能が含まれています。[31]

も参照してください

参照

  1. ^ 「初版Unixマニュアル「その他」セクション(PDF)」 (PDF)2000-08-29にオリジナル (PDF)からアーカイブされました2011年5月11日取得
  2. ^ McIlroy、MD(1987)。Research Unixリーダー:プログラマーマニュアル、1971年から1986年(PDF)(テクニカルレポート)からの注釈付きの抜粋。CSTR。ベル研究所。139。
  3. ^ a b fnmatch(3)  –  Linuxプログラマーマニュアル–ライブラリ関数
  4. ^ glob(3)  –  Linuxプログラマーマニュアル–ライブラリ関数
  5. ^ [ https://www.gnu.org/software/bash/manual/bash.html#Pattern-MatchingBashリファレンスマニュアル
  6. ^ a b "The Open Group Base Specification Issue 7 IEEE Std 1003.1、2013 Edition、2.13。PatternMatchingNotation"
  7. ^ a b "Linuxプログラマーマニュアル、GLOB(7)"
  8. ^ 「AdvancedBash-ScriptingGuide、Chapter 19.2:Globbing」(Mendel Cooper、2003)には、ファイル名のグロブパターンの簡潔な例があります。
  9. ^ 「バッシュグロブ」gregのbashナレッジベース2019年11月25日取得
  10. ^ ab パターンマッチング」Bashリファレンスマニュアル
  11. ^ 「コマンドレットパラメータでのワイルドカード文字のサポート」MicrosoftMicrosoftDeveloperNetwork。
  12. ^ 「ワイルドカード拡張」MicrosoftDeveloperNetwork。2013年。
  13. ^ 「ワイルドカード拡張」docs.microsoft.com
  14. ^ WindowsのワイルドカードMSDNDevblog。
  15. ^ 「LIKE(Transact-SQL)」
  16. ^ ホップクロフト、ジョンE .; モトワニ、ラジーブ; ウルマン、ジェフリーD.(2000)。オートマトン理論、言語、および計算の概要(第2版)。アディソン-ウェスリー。
  17. ^ a b "Lib/fnmatch.py​​"Python。2021-01-20 2021-11-10を取得
  18. ^ 「kthompson/glob」GitHub 2020年11月6日取得
  19. ^ "std.path-Dプログラミング言語-デジタル火星"dlang.org 2014年9月8日取得
  20. ^ 「isaacs/minimatch」GitHub 2016年8月10日取得
  21. ^ 「jonschlinkert/micromatch」GitHub 2017年4月4日取得
  22. ^ 「パッケージファイルパス-Goプログラミング言語」Golang.org 2011年5月11日取得
  23. ^ 「ファイル操作」Oracle 2013年12月16日取得
  24. ^ 「Glob-0.7.4:Globbingライブラリ」2014年5月7日取得
  25. ^ "File ::Glob-BSDglobルーチンのPerl拡張子"perldoc.perl.org 2011年5月11日取得
  26. ^ "グロブ-手動"PHP。2011-05-06 2011年5月11日取得
  27. ^ "10.7。glob— Unixスタイルのパス名パターン拡張—Pythonv2.7.1ドキュメント"Docs.python.org 2011年5月11日取得
  28. ^ "「グロブ」ライブラリルーチン」。2007年12月19日にオリジナルからアーカイブ2011年5月11日取得
  29. ^ 「クラス:Dir」Ruby-doc.org 2011年5月11日取得
  30. ^ "#glob--Lib.rs"lib.rs。_ 2021-11-12を取得{{cite web}}: CS1 maint: url-status (link)
  31. ^ 「TCLグロブのマニュアルページ」2011年11月16日取得