シェルのコマンドラインにおいて、ファイル・ディレクトリの名前を打ち込む時にメタキャラクター(正規表現)を使用すると長い名前や、複数のファイル・ディレクトリ名を短く簡単に表すことができる。
例えば、C言語のプログラムファイル(ファイル名の最期が.cになるファイル)は*.cによって表すことができる。
また、メタキャラクターは組み合わせて使用できるので、複雑なパターンのファイル名も表すことができる。
メタキャラクターには以下の記号を使用する。
ここでは主にlsコマンドを使用しているが、別のコマンド(viその他)でも同じようにファイル名にメタキャラクターが使用できる。
% ls a.out test1.c test2.c tmp1.c tmp2.c tmp3.c % ls *.c ← ファイル名の最後が.cのファイル test1.c test2.c tmp1.c tmp2.c tmp3.c % ls ????.c ← 任意の文字が4文字あって最後が.cになるファイル tmp1.c tmp2.c tmp3.c % ls tmp[23].* ← tmpの後に2か3が来てピリオドの後に0文字以上の文字が続くファイル名 tmp2.c tmp3.c % ls *[23].* ← 2か3の後にピリオドが来て、それらの前後に0文字以上の文字が来るファイル名 test2.c tmp2.c tmp3.c % ls [A-Za-z].??? ← 最初の文字が大文字・小文字のアルファベットでピリオドの後に任意の3文字が続くファイル名 a.out % ls {a,tmp}.* ← 最初がaかtmpでピリオドの後に0文字以上の文字が続くファイル名 a.out tmp1.c tmp2.c % ls *.o ls: No match ← 最後に.oがつくファイル名は無いのでエラーになる % echo * ← lsの代わり a.out test1.c test2.c tmp1.c tmp2.c tmp3.c %
上で説明したメタキャラクターはコマンドが実行される前にシェルによって実際のファイル名に展開される。
つまり、コマンドの実行の順番は以下のようになる。
例えば、上の例でecho *が実行される順番は以下の様になる。
あるファイルがどこのディレクトリにあるか探したい時、どうすれば良いだろうか?
各ディレクトリの中をいちいちlsコマンドによって探していたのでは、
たくさんディレクトリがある時には非常に大変である。
そのような場合は findコマンドを使うと便利である。
findの使い方は他のコマンドと違っていて少し複雑だが、
様々な条件によってファイルを見つけたり、見つけたファイルに対して他のコマンドを適用することができるので覚えておくと役にたつコマンドである。
findの使用法は以下のようである。
ここではfindの代表的な使い方をいくつか並べてみた。
ここにある以外にもオプションの組合せによってさらに複雑な使い方ができる。
% find . -name file ./aaa/bbb/ccc/file <- ./aaa/bbb/cccがfileのあるディレクトリ最初の . (ピリオド、カレントディレクトリを表す)が探すディレクトリになる。
% find . -name "*.c" ./aaa/test1.c ./bbb/test2.c*以外のメタキャラクターとしてはシェルのコマンドラインで使用できるもと同じものが使用できる。( ?, [ ] )
% find . -name core -exec rm {} \;
% find . -mtime -2-2を+2にすると2日より前に変更されたファイルを探す。
% find . -newer oldfile
% find . -size +1024c