# `glob` --- Unix 形式のパス名のパターン展開

ソースコード: Lib/glob.py

The `glob` module finds all the pathnames matching a specified pattern according to the rules used by the Unix shell, although results are returned in arbitrary order. No tilde expansion is done, but `*`, `?`, and character ranges expressed with `[]` will be correctly matched. This is done by using the `os.scandir()` and `fnmatch.fnmatch()` functions in concert, and not by actually invoking a subshell.

Note that files beginning with a dot (`.`) can only be matched by patterns that also start with a dot, unlike `fnmatch.fnmatch()` or `pathlib.Path.glob()`. (For tilde and shell variable expansion, use `os.path.expanduser()` and `os.path.expandvars()`.)

リテラルにマッチさせるには、メタ文字を括弧に入れてください。例えば、`'[?]'` は文字 `'?'` にマッチします。

参考

`pathlib` モジュールは高水準のパスオブジェクトを提供します。

`glob.``glob`(pathname, *, recursive=False)

  pathname (パスの指定を含んだ文字列でなければいけません) にマッチする、空の可能性のあるパス名のリストを返します。pathname は (`/usr/src/Python-1.5/Makefile` のように) 絶対パスでも、(`../../Tools/*/*.gif` のように) 相対パスでもよく、シェル形式のワイルドカードを含んでいてもかまいません。結果には (シェルと同じく) 壊れたシンボリックリンクも含まれます。結果がソートされるかどうかは、ファイルシステムによって異なります。この関数の呼び出し中に条件を満たすファイルが移動や追加された場合、そのファイルのパス名を含むかどうかは指定されていません。

  recursive が真の場合、パターン "`**`" はあらゆるファイルや0個以上のディレクトリ、サブディレクトリおよびディレクトリへのシンボリックリンクにマッチします。パターンの末尾が `os.sep` または `os.altsep` の場合、ファイルは一致しません。

  引数 `pathname`, `recursive` を指定して 監査イベント `glob.glob` を送出します。

  注釈

  パターン "`**`" を大きなディレクトリツリーで使用するととてつもなく時間がかかるかもしれません。

  バージョン 3.5 で変更: "`**`" を使った再帰的な glob がサポートされました。

`glob.``iglob`(pathname, *, recursive=False)

  実際には一度にすべてを格納せずに、`glob()` と同じ値を順に生成する イテレーター を返します。

  引数 `pathname`, `recursive` を指定して 監査イベント `glob.glob` を送出します。

`glob.``escape`(pathname)

  すべての特殊文字 (`'?'` 、 `'*'` 、 `'['`) をエスケープします。特殊文字を含んでいる可能性のある任意のリテラル文字列をマッチさせたいときに便利です。drive/UNC sharepoints の特殊文字はエスケープされません。たとえば Windows では `escape('//?/c:/Quo vadis?.txt')` は `'//?/c:/Quo vadis[?].txt'` を返します。

  バージョン 3.4 で追加.

たとえば、次の 3 個のファイル `1.gif`, `2.txt`, `card.gif` と、ファイル `3.txt` だけを含んだサブディレクトリ `sub` があった場合、`glob()` は以下の結果を返します。パスに接頭する要素がどう維持されるかに注意してください。:

    >>> import glob
    >>> glob.glob('./[0-9].*')
    ['./1.gif', './2.txt']
    >>> glob.glob('*.gif')
    ['1.gif', 'card.gif']
    >>> glob.glob('?.gif')
    ['1.gif']
    >>> glob.glob('**/*.txt', recursive=True)
    ['2.txt', 'sub/3.txt']
    >>> glob.glob('./**/', recursive=True)
    ['./', './sub/']

ディレクトリが `.` で始まるファイルを含んでいる場合、デフォルトでそれらはマッチしません。例えば、 `card.gif` と `.card.gif` を含むディレクトリを考えてください:

    >>> import glob
    >>> glob.glob('*.gif')
    ['card.gif']
    >>> glob.glob('.c*')
    ['.card.gif']

参考

`fnmatch` モジュール

  シェル形式の (パスではない) ファイル名展開