ファイル名の正規表現とファイルのサーチ

正規表現

正規表現とは

シェルのコマンドラインにおいて、ファイル・ディレクトリの名前を打ち込む時にメタキャラクター(正規表現)を使用すると長い名前や、複数のファイル・ディレクトリ名を短く簡潔に表すことができる。
例えば、C 言語のプログラムファイル(ファイル名の最期が .c になるファイル)は *.c によって表すことができる。
また、メタキャラクターは組み合わせて使用できるので、複雑なパターンのファイル名も表すことができる。
メタキャラクターには以下の記号を使用する。

*
0 文字以上の任意の文字列
0 文字以上なので、文字が無くてもマッチする。
たとえばa*a, aa, abcde, a123 などにマッチする。
?
任意の 1 文字
たとえば ??? は 3 文字のファイル名を表し、 aaa, abc, 123 などにマッチする。
[...]
[ ]の中の 1 文字

たとえば [abc]eeaee, bee, cee とマッチする。
ただし、アルファベット、数字の続いた部分は次のようにも表現できる
[a-e]
[abcde] と同じ
[1-5]
[12345] と同じ
[A-Za-z]
大文字、小文字を含んだアルファベット全部
{str1,str2,...}
str1,str2...中の文字列の一つ
たとえば {abc,def}ggabcgg, defgg などとマッチする。

ここでは主にlsコマンドを使用しているが、別のコマンド(vi, ccp, mv, rm その他)でも同じようにファイル名にメタキャラクターが使用できる。

% 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
%

様々なコマンドにおける使用例。

ファイル名の展開

上で説明したメタキャラクターはコマンドが実行される前にシェルによって実際のファイル名に展開される。
つまり、コマンドの実行の順番は以下のようになる。

  1. *, ?, [ ], { }にあてはまるファイル名を探す。
  2. ファイル名が見つかったら、それらの記号の部分をファイル名に置き換える。
    見つからなかったらエラーとしてコマンドは実行しない。
  3. 置き換わったファイル名でコマンドを実行する。

例えば、上の例で echo * が実行される順番は以下の様になる。

  1. * にあてはまるファイル名を探す。
    a.out test1.c test2.c tmp1.c tmp2.c tmp3.c があてはまる。
  2. * をこれらのファイル名で置き換える。
    echo *を echo a.out test1.c test2.c tmp1.c tmp2.c tmp3.c に置き換える。
  3. echo a.out test1.c test2.c tmp1.c tmp2.c tmp3.c が実行される。

ファイルを探す

あるファイルがどこのディレクトリにあるか探したい時、どうすれば良いだろうか?
各ディレクトリの中をいちいち ls コマンドによって探していたのでは、 たくさんディレクトリがある時には非常に大変である。 そのような場合は find コマンドを使うと便利である。
find の使い方は他のコマンドと違っていて少し複雑だが、 様々な条件によってファイルを見つけたり、見つけたファイルに対して他のコマンドを適用することができるので覚えておくと役にたつコマンドである。

find の使用例

find の使用法は以下のようである。

以下に find の代表的な使い方をいくつか並べてみた。
(ここにある以外にもオプションの組合せによってさらに複雑な使い方ができる)

練習課題

参考


Prev
Home | Contents
abe@injapan.net