12.3 ファイル名の展開
初心者は GUI の方が使いやすいと感じますが,熟練者は CUI を使うことも多くあります.一般に,大量のデータを扱う複雑な作業では CUI の方が便利であると言われています.例として,シェルのファイル名展開機能を見てみましょう.
ファイルの数が多くなってくると,それをすべて列挙するのが大変になっ てきます.そこでシェルには,あるパターンのファイル名をまとめて指定する 仕組みが用意されています.「*」,「?」,「[」,「]」,「{」,「}」,「~」 などは,複数の文字や文字列を代表するための特別な文字です.このような文字を メタキャラクタ(meta character)と言います.
メタキャラクタを含む引数があると,シェルは以下の規則に従って合致するファイル名を探し,合致したファイル名全部と置き換えます.
- *:任意の文字列と合致する.
- ?:任意の一文字と合致する.
- []:括弧の中に書いた文字のどれかと合致する.ただし,先頭が「^」ならば,その後に書いていない文字と合致する.
- {}:括弧の中に書いた文字列のどれかと合致する.文字列は「,」で区切る.
- ~:単語の先頭にある場合に限り,後に続くログイン名のユーザのホームディレクトリと合致する.後にログイン名がなければ自分のホームディレクトリと合致する.
「*」や「?」はポーカーでジョーカーが他のどんなカードの代わりにでも使えるのと似ている ので,ワイルドカードと呼ぶ人もいます.
注意メタキャラクタは操作を間違えた場合の影響も大きいので注意する必要があり ます.特にファイルを削除するような場合はコマンドを実行する前に,削除さ れるファイルをよく確認してください.
例えば,カレントディレクトリのすべてのファイルの中から happy という文字列を探したければ,
% grep happy * |
とします.ファイル名が .txt か .text で終わるファイルだけを探す対象にしたければ,
% grep happy *.{txt,text} |
とします.
注意「.」で始まるファイル名は特別扱いなので,単に「*」としただけでは合致しません.
● 練習問題
カレントディレクトリを /pub/sfc/ipl/1a/exercise/filename にし,ls コマンドで中にあるファイル名を確認しなさい.
- ls a* を実行するとどうなるでしょう.
- ls a? を実行するとどうなるでしょう.
- ls a?? を実行するとどうなるでしょう.
- ファイル名が a で始まって e で終わるものだけを表示するにはどうすればよいでしょう.
- ls [ab]* を実行するとどうなるでしょう.
- ls [^a]* を実行するとどうなるでしょう.