今野 英明
平成26年4月21日
この章の内容に関するより詳しい説明は,例えば, 昨年度の情報機器の操作テキスト 「ディレクトリ」や「パス名」の資料にあります。
ファイル名やディレクトリ名のみ1 を記述すればよい。
パス名を記述する。
ルートディレクトリを基点として,ディレクトリやファイルの位置を表すもの。
例)
カレントディレクトリとの相対的な関係によって,ディレクトリやファイルの位置を表もの。 相対パスでは,カレントディレクトリを . (ドット) で表し,親ディレクトリを .. (ドット二つ)で表す。 絶対パスとの表記上の大きな違いは,パス名の先頭に / を付けないこと。
例)
移動するファイル junk はカレントディレクトリ内のファイルですから,ファイル名で指定すればいいですが,移動先は親ディレクトリなのでディレクトリ名での指定はできません。
mv a1 a2 a3 a4 a5 distdirを実行すれば希望は叶えられますが,移動するファイルをすべて列挙するのは面倒です。
この例のように,一度のコマンド操作で複数のファイルを処理したいとき,メタキャラクタ(meta-character)という,シェルにとって特殊な意味のある文字を利用すると便利です。 メタキャラクタを用いると,上記の操作は
mv a? distdir
や
mv a* distdirで済みます。a? と a* は,シェルによって共に a1 a2 a3 a4 a5 に展開 (置き換え) されてから,引数として mv コマンドに渡されます。
にマッチする2メタキャラクタです。 その具体的な使い方を次の例で見てみます。?
: 任意の1文字
*
: 任意の文字列
A A1 B C a a1 a11 a12 a13 a2 a3 b b1 b11
echo コマンドは,引数に与えた文字列をそのまま表示するコマンドでした。 例えば,
echo abc d eを実行すると,画面に abc d e と表示されます。 この echo コマンドを使い,? を含む引数がどのようなファイル名に展開されるのかを調べましょう。
echo ?echo の引数に ? を与えても,? とは表示されません。
echo ??
echo ???
echo ????
シェルは ? をカレントディレクトリに存在する 1 文字からなるファイル名のリストに展開し,引数として echo コマンドに渡します。 その結果として 1 文字からなるファイル名がすべて表示されます。
同様に,?? は 2 文字の,??? は 3 文字のファイル名に展開されます。 4 文字のファイル名をもつファイルはカレントディレクトリに存在しないので,最後の例では,その旨のメッセージが出ます。
echo a?最初の例では,ファイル名の先頭が a であって,その後に何という文字でも構わないから,1文字が続くものに展開されます。 その次の例は,1 の前後に任意の 1 文字が存在するファイル名に展開されます。
echo ?1?
echo /bin/????だと,/bin というディレクトリに存在するファイルのうち,4 文字のファイル名をもつものが該当します。
なお,? はファイル名の先頭にある . や,パス名の区切り記号 / にはマッチしません。
* は ? に似ていますが,1 文字のみではなく,任意の長さの文字列にマッチする点が異なります。
次の例は,各々 a と a1 で始まるファイル名に展開されます。
echo a*最初の例で注意すべきは,展開されたファイル名の中に a が含まれていることです。 すなわち,任意の長さには,0 文字の長さも含みます。 同じ理由から,2 番目の例でも,a1 が結果に含まれます。
echo a1*
次の結果も,容易に予想できるでしょう。
echo *3
echo *
echo /bin/*
なお,? の場合と同様に,* はファイル名の先頭にある . や,パス名の区切り記号 / にはマッチしませんので,これらは明示的に記述する必要があります。 例えば,カレントディレクトリに存在する . で始まるファイル名をすべて扱うには .* とする必要があります。
以上,? や * がどのようなファイル名に展開されるのかを調べるために echo コマンドのみを使ってきましたが,メタキャラクタはシェルが解釈する特殊文字なので,コマンドの引数一般に利用することができます3。
例えば,カレントディレクトリに存在する a で始まるファイルを調べたければ,ls a* を実行するのが自然でしょう。 なお,ls の引数にファイル名を与えると,そのファイルの情報のみが表示されます。
*
や ?
以外のメタキャラクタとして,次のものもあります。
これらは次のように使います。
~
ホームディレクトリ (csh 系のシェルで利用可能) [
c1c2...]
[ ]
内の1文字([
c1-
c2]
を用いて文字範 囲を指定することも可能){
string1,string2, ...}
{ }
内の文字列
echo ~ ls ~ echo ~/a* echo [abc] ls [abc] echo [A-Z]* echo /{bin,usr,var} ls /{bin,usr,var}
[abc]
は a, b, c のいずれかのファイル名に,[A-Z]*
は大文字で始まるファイル名に展開されます。
/{bin,usr,var}
は /bin /usr /var
に展開されます。
echo What is your name?を,結果を予想してから実行してみましょう。
メタキャラクタである ? を,普通の文字として echo コマンドで出力するには,シェルによる ? の展開を抑止(エスケープ)してから,echo コマンドの引数に与える必要があります。
また,シェルが特殊な意味を持つ記号として解釈する文字には,$
や "
,空白等,これまでに紹介した以外にも存在します。
コマンド行において,それらを普通の文字として扱う場合にも,次のようにして特殊文字の持つ意味を無効にする必要があります。
\c
'string'
echo What is your name\?前者の場合,echo の引数が 4 個であるのに対し,後者では一つです。
echo 'What is your name?'
時間に余裕があれば, tcsh のオンラインマニュアルを読むことも有意義です。
これらを実際に行うために必要なファイル等を,echo コマンド等で作成してから,実際に操作を試してください。
(ヒント:ファイル名には空白文字を含めることも可能です。ただし,この問を解く以外の場面では推奨しません。)