概要
ファイルパスを指定するのに利用される glob パターンについて解説します。
glob パターンは、Python のファイル検索モジュール glob
、.gitignore
の記述など多岐に利用されています。
glob
glob は、ワイルドカード を利用したファイルパスを指定する構文です。
任意の1文字 ?
([]
で囲われていないもの)
?
は任意の1文字にマッチします。
例: hoge?
の場合、hoge1, hoge2
にマッチします。
任意の文字列 *
([]
で囲われていないもの)
*
は空の文字列を含む任意の文字列にマッチします。
例: hoge*
の場合、hoge, hoge123
にマッチします。
いずれかの1文字 [<文字>]
[]
の中のいずれか1文字にマッチします。
例: [abc]def
の場合、adef, bdef, cdef
にマッチします。
[]
の中の文字は[]*?
などであってもそのままの文字として扱われます。
例:[[*?]
の場合、[
、*
、?
のいずれか1文字を表します。-
で区切られた2つの文字は、範囲を表します。
例:[A-Z]
: 大文字のアルファベットのいずれか1文字
例:[a-z]
: 小文字のアルファベットのいずれか1文字
例:[a-zA-Z]
: アルファベットのいずれか1文字
例:[0-9]
: 数字のいずれか1文字!
は否定を表し、そのあとに続く文字以外を表します。 例:[!abc]
:a
、b
、c
以外のいずれか1文字を表します。
エスケープ
?
、*
、[
という文字自体を表したい場合は文字の前に \
をつけて、エスケープします。
例: \[2021]*
の場合、[2021]hoge
にマッチします。
パス名
glob パターンでパスを指定した場合、セパレータで区切られた部分ごとにマッチングが行われます。
例: [abc]hoge/*.jpg
のようにパスを指定した場合、「[abc]hoge
にマッチするディレクトリ以下にある *.jpg
にマッチするファイル」と解釈されます。
任意の階層 **
hoge
├── depth1
│ ├── depth2
│ │ └── untitled.txt
│ └── untitled.txt
└── untitled.txt
このような階層になっていた場合、
hoge/*/*.txt
の場合、hoge
の1階層下にあるディレクトリ内にある *.txt
にマッチするファイルという意味になります。
hoge/depth1/untitled.txt
hoge/depth2/untitled.txt
これを hoge/**/*.jpg
とすると、hoge
以下の任意の階層にある *.txt
にマッチするファイルという意味になります。
hoge/untitled.txt
hoge/depth1/untitled.txt
hoge/depth1/depth2/untitled.txt
hoge/depth2/untitled.txt
この方法は指定ディレクトリ以下をすべて検索するので、階層構造が深くなっている場合は処理に時間がかかるため、注意してください。
利用例
Python の glob
phatlib の Path.glob()
で指定したディレクトリ以下の .txt
ファイルを探す例です。
from pathlib import Path
for path in Path().glob("hoge/**/*.txt"):
print(path)
hoge/untitled.txt hoge/depth1/untitled.txt hoge/depth1/depth2/untitled.txt hoge/depth2/untitled.txt
.gitignore の指定
.gitignore
の指定方法の例です。
*.exe
: 拡張子が.exe
のファイルbin/
: 名前がbin
のディレクトリpackage/**/*.txt
:package
以下の任意の階層にある拡張子が.txt
のファイル
コメント