ワイルドカードとグロブパターン
このレッスンで分かること
- グロブは
*?[...]で書くシェル側のファイル名パターンマッチ機能*はドット始まりの隠しファイルにマッチしません、.[!.]*かshopt -s dotglob- 最小例は
ls *.txt/cp /tmp/glob/*.{txt,md} /tmp/backup/
ワイルドカードとグロブパターン とは
ファイル検索などで利用するワイルドカード(*や?)とグロブパターンの使い方を解説します。本レッスンでは、ワイルドカードとグロブパターン の基本から実際の使いどころまでを整理し、現場で迷わず使える形に落とし込みます。
なぜ重要か
「拡張子が .log のものだけまとめてコピー」「番号付きファイル report_01.txt から report_09.txt までを一気に削除」といった操作を毎回 1 件ずつ指定していたら、コマンドラインの便利さは半減してしまいます。シェルが提供する グロブ (glob) と呼ばれるパターンマッチを使えば、ファイル名の一致条件を *、?、[...] のような短い記号で表せます。ls、cp、mv、rm、tar などのコマンドは、グロブを使ったファイル名展開をシェルから受け取って動きます。find の -name も内部的に同じ記号を使うため、ワイルドカードの理解はシェル全般のスキルです。
基本構文
シェルがパターンを展開してから、コマンドに渡します。
ターミナル
ls *.txt # 拡張子 txt のファイル全部
ls log_?.txt # log_1.txt, log_a.txt は対象、log_10.txt は対象外
ls report_[0-9].txt # 0-9 のいずれかが入った名前主なメタ文字は次のとおりです。
| 記号 | 意味 |
|---|---|
* | 任意の 0 文字以上 (ただしドット始まりは含まない) |
? | 任意の 1 文字 |
[abc] | a または b または c のいずれか 1 文字 |
[!abc] | a/b/c 以外の 1 文字 |
[0-9] | 範囲指定 (この例は数字) |
{a,b,c} | ブレース展開、シェル独自の一括指定 |
動作の図解
重要なのは、コマンドが受け取った時点で *.log という文字列はもはや残っていない、という点です。シェルがファイル名にまで展開してからコマンドへ渡しているのです。マッチしなかった場合は通常そのままの文字列がコマンドに渡るため、ls *.notfound は「*.notfound というファイルはない」というエラーになります。
代表例
ブレース展開でファイルを連番で作るのが便利です。
ターミナル
$ touch /tmp/glob/report_{01..05}.txt
$ ls /tmp/glob
report_01.txt report_02.txt report_03.txt report_04.txt report_05.txt範囲指定で特定の名前だけ拾います。
ターミナル
$ ls /tmp/glob/report_[0][1-3].txt
report_01.txt report_02.txt report_03.txt複数の拡張子をまとめて扱うときはブレース展開が活躍します。
ターミナル
$ cp /tmp/glob/*.{txt,md} /tmp/backup/ドットファイルを含めたいときは * の代わりに shopt -s dotglob を有効にするか、.[!.]* のように明示します。
ターミナル
$ ls .[!.]*
.bashrc .profileよくある間違い
*はドットで始まる隠しファイルにマッチしません。.bashrcや.envを扱いたいときは.*、またはshopt -s dotglobで挙動を変えるのが定番です。隠しファイルを忘れてバックアップ漏れになる事故は意外と多いです。
ブレース展開はシェル機能であって、コマンド側が処理しているわけではありません。
find /tmp -name 'report_{01..05}.txt'のように find に渡しても展開されないので、ブレース展開と find のグロブは混同しないようにしましょう。
やってみよう
/tmp/globlab の中にブレース展開で 5 つのファイルを作り、ls でパターンマッチを試してみましょう。クォートを付けたときと付けないときの違いも体感してください。
拡張グロブと globstar
bash には shopt -s globstar を有効にすると使える ** という記法があります。複数階層をまとめて再帰的にマッチさせたい時に便利で、find を呼ばなくても済む場面が増えます。
ターミナル
$ shopt -s globstar
$ ls **/*.md
README.md docs/setup.md docs/api/auth.mdまた、extglob を有効にすると !(pattern) や +(a|b) などの拡張パターンが使えます。否定マッチが必要な時に便利です。
ターミナル
$ shopt -s extglob
$ ls !(*.log)
README.md data.csvグロブと正規表現の違い
グロブと正規表現は似て非なる存在です。正規表現の . は「任意の 1 文字」ですが、グロブでは ? がその役割を担います。grep などの検索コマンドへ正規表現を渡すときと、シェルにグロブを渡すときで、書き方を切り替える必要があります。
| 意味 | グロブ | 正規表現 |
|---|---|---|
| 任意の 1 文字 | ? | . |
| 0 文字以上 | * | .* |
| 集合 | [abc] | [abc] |
ここまでの要点
グロブはシェル機能、* ? [...] でファイル名展開。隠しファイルは * の対象外。globstar (**) と extglob (!(...)) で表現力を拡張。正規表現とは記号の意味が違うので混同しない。
まとめ
- グロブはシェルが提供するファイル名パターンマッチ機能
*?[...]でファイル名を絞り込み、{a,b,c}で複数候補を展開する- 展開はシェルが行うので、コマンドに届くのは展開後のリスト
- 隠しファイルやマッチ無しの挙動には注意する
- 必要に応じて
globstarやextglobで表現力を増やせる
次のレッスン
次は ファイルの圧縮と解凍 で、ファイル検索などで利用するワイルドカード(*や?)とグロブパターンの使い方を解説します を学びます。
事前確認 — 進む前に次の 3 つができることを確認しましょう。
- ワイルドカード の要点を自分の言葉で説明できる
- このレッスンの最小コード (または操作手順) を見ずに書ける
- 練習問題やクイズで間違えた箇所を読み直して理解した
理解度チェック (30 秒)
Q. ワイルドカード とは何か、1 文で説明してください。
A. 本文の「このレッスンで分かること」または冒頭の説明文を見直し、自分の言葉で要約できれば OK。詰まったら本レッスンの最初の H2 セクションを読み返してみましょう。
関連レッスン
課題
- ブレース展開でファイルを作成する
- 角括弧パターン [1-3] を使う
- ls で表示する