パス名展開(ワイルドカード)について

パス名展開の一覧

記法意味
*0文字以上の任意の文字列*.txt, file*
?任意の1文字file?.txt
[...]括弧内のいずれかの1文字file[12].txt
[a-z]指定した範囲のいずれか1文字file[1-3].txt
[!...]括弧内に含まれないいずれか1文字file[!1].txt

*(アスタリスク)

0文字以上の任意の文字列にマッチします。最もよく使われるワイルドカードです。

code
# ダミーファイルの作成
touch file.txt file1.txt file10.txt other.md

# .txt で終わるすべてのファイル
ls *.txt

echo '--------------------'

# file で始まるすべてのファイル
ls file*
stdout
file.txt
file1.txt
file10.txt
--------------------
file.txt
file1.txt
file10.txt

?(クエスチョンマーク)

任意の1文字にマッチします。0文字(マッチなし)や2文字以上にはマッチしません。

code
# ダミーファイルの作成
touch file.txt file1.txt file2.txt file10.txt

# file + 任意の1文字 + .txt
# file1.txt, file2.txt にはマッチするが
# file.txt (0文字) や file10.txt (2文字) にはマッチしない
ls file?.txt
stdout
file1.txt
file2.txt

[...](ブラケット)

括弧内に指定した文字のいずれか1文字にマッチします。「-」を使った範囲指定や、「!」を使った否定も可能です。

code
# ダミーファイルの作成
touch file1.txt file2.txt file3.txt file4.txt

# 1 か 3 にマッチ
ls file[13].txt

echo '--------------------'

# 1 から 3 の範囲にマッチ
ls file[1-3].txt

echo '--------------------'

# 1 以外にマッチ
ls file[!1].txt
stdout
file1.txt
file3.txt
--------------------
file1.txt
file2.txt
file3.txt
--------------------
file2.txt
file3.txt
file4.txt

ブレース展開との違い

ブレース展開({ })は「単なる文字列の生成」ですが、パス名展開は「実在するファイル」を探します。パス名展開では、マッチするファイルが存在しない場合、パターンが展開されずにそのまま残ります。

code
# ブレース展開:ファイルがなくても文字列を生成する
echo {1..3}.md

echo '--------------------'

# パス名展開:ファイルがない場合はそのまま残る
# (カレントディレクトリに .md ファイルがない場合)
echo *.md
stdout
1.md 2.md 3.md
--------------------
*.md