ワイルドカード

普通はファイル名の指定に使うけど、case 文のパターンにも使える。

$ ls
bar     foo     foobar  food    fool    foot

$ ls foo?           # 1 文字にマッチ
food    fool    foot

$ ls foo*           # 0 文字以上にマッチ
foo     foobar  food    fool    foot

$ ls foo[a-n]       # 範囲内の 1 文字にマッチ
food    fool

$ ls foo[!a-n]      # 範囲外の 1 文字にマッチ
foot

$ ls ?oo[a-n]*      # 上記の組み合わせ
foobar  food    fool

いつ誰が評価するのか

Unix ではシェルが評価し*1DOS では各コマンドが評価する。

シェルはワイルドカードをいつ評価するのか?

$ ls
bar     foo     foobar  food    fool    foot

$ wildcard=foo?

$ echo $wildcard
food fool foot

$ cd /
$ echo $wildcard    # ここで評価すると
foo?                # マッチしなかった

コマンドに引数として渡す際に評価している。

ちなみに変数に入れたワイルドカードそのものを見たいときは、どうするか?

$ ls
bar     foo     foobar  food    fool    foot

$ wildcard=foo?

$ echo $wildcard
food fool foot      # 展開されてしまった

$ echo "$wildcard"
foo?

文字列にしてやればいい。

マッチしなかったとき

上の例でも見たように、ワイルドカードにマッチするファイルがなかった場合は、その文字列がそのまま使用される。

$ for f in foo??; do rm $f; done
rm: foo??: No such file or directory

マッチしなくても for の中は 1 回 実行される。

大量にマッチしたとき

ワイルドカードを展開するバッファは有限で、そのサイズはシェル自身をコンパイルしたときに静的に決まる。(みたい)

すなわち、あまりたくさんのファイルがマッチしてしまうと、展開に失敗する。

$ ls many/files/* || echo NG: $?
-bash: /bin/ls: Argument list too long
NG: 126

*1:find(1) など、ワイルドカードを処理するコマンドも存在する。