Linux – glob で使えるワイルドカードの指定方法

目次

概要

ファイルパスを指定するのに利用される 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]: abc 以外のいずれか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 ファイルを探す例です。

In [1]:
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 のファイル

コメント

コメントする

目次