ファイル名の正規表現とファイルのサーチ
正規表現
正規表現とは
シェルのコマンドラインにおいて、ファイル・ディレクトリの名前を打ち込む時にメタキャラクター(正規表現)を使用すると長い名前や、複数のファイル・ディレクトリ名を短く簡潔に表すことができる。
例えば、C 言語のプログラムファイル(ファイル名の最期が .c になるファイル)は *.c によって表すことができる。
また、メタキャラクターは組み合わせて使用できるので、複雑なパターンのファイル名も表すことができる。
メタキャラクターには以下の記号を使用する。
- *
- 0 文字以上の任意の文字列
0 文字以上なので、文字が無くてもマッチする。
たとえばa*は
a, aa, abcde, a123
などにマッチする。
- ?
- 任意の 1 文字
たとえば ??? は
3 文字のファイル名を表し、
aaa, abc, 123
などにマッチする。
- [...]
- [ ]の中の 1 文字
たとえば [abc]ee は
aee, bee, cee
とマッチする。
ただし、アルファベット、数字の続いた部分は次のようにも表現できる
- [a-e]
- [abcde] と同じ
- [1-5]
- [12345] と同じ
- [A-Za-z]
- 大文字、小文字を含んだアルファベット全部
- {str1,str2,...}
- str1,str2...中の文字列の一つ
たとえば {abc,def}gg は
abcgg, 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
%
様々なコマンドにおける使用例。
- 最期に .iff のつく画像ファイル全部を別のディレクトリ(dir)へコピーする。
% cp *.iff dir
- 最期に .iff のつく画像ファイル全部を消去する。
% \rm *.iff ← rm の前に \ をつけているので問い合わせをしないで消去する
ファイル名の展開
上で説明したメタキャラクターはコマンドが実行される前にシェルによって実際のファイル名に展開される。
つまり、コマンドの実行の順番は以下のようになる。
- *, ?, [ ], { }にあてはまるファイル名を探す。
- ファイル名が見つかったら、それらの記号の部分をファイル名に置き換える。
見つからなかったらエラーとしてコマンドは実行しない。
- 置き換わったファイル名でコマンドを実行する。
例えば、上の例で echo * が実行される順番は以下の様になる。
- * にあてはまるファイル名を探す。
a.out test1.c test2.c tmp1.c tmp2.c tmp3.c があてはまる。
- * をこれらのファイル名で置き換える。
echo *を
echo a.out test1.c test2.c tmp1.c tmp2.c tmp3.c に置き換える。
- echo a.out test1.c test2.c tmp1.c tmp2.c tmp3.c が実行される。
ファイルを探す
あるファイルがどこのディレクトリにあるか探したい時、どうすれば良いだろうか?
各ディレクトリの中をいちいち ls コマンドによって探していたのでは、
たくさんディレクトリがある時には非常に大変である。
そのような場合は find コマンドを使うと便利である。
find の使い方は他のコマンドと違っていて少し複雑だが、
様々な条件によってファイルを見つけたり、見つけたファイルに対して他のコマンドを適用することができるので覚えておくと役にたつコマンドである。
find の使用例
find の使用法は以下のようである。
以下に find の代表的な使い方をいくつか並べてみた。
(ここにある以外にもオプションの組合せによってさらに複雑な使い方ができる)
- ある名前のファイルを見つける。
これが find の最も良く使われる使い方である。
今いるディレクトリ(カレントディレクトリ)から下のディレクトリにある
file という名前のファイルを探すためには以下のようにコマンドを使用する。
% find . -name file
./aaa/bbb/ccc/file <- ./aaa/bbb/cccがfileのあるディレクトリ
最初の . (ピリオド、カレントディレクトリを表す)が探すディレクトリになる。
-nameの後ろに探すファイル名を打ち込む。
またファイル名には上で説明した正規表現も使用することができる。
例えば、C言語のプログラムファイルだけを探す時は以下のように実行する。
% find . -name "*.c"
./aaa/test1.c
./bbb/test2.c
* 以外のメタキャラクターとしてはシェルのコマンドラインで使用できるもと同じものが使用できる。( ?, [ ] )
- find によって探したファイルに対して他のコマンドを実行する。
良く使われるのは、あるディレクトリ以下のファイルを消す時である。
例えば、カレントディレクトリの下の core という名前のファイルを消すには以下のように打ち込む。
% find . -name core -exec rm {} \;
- -name coreによって core という名前のファイルを見つける。
- -execの後のコマンドrmが実行される。
その時見つかったファイル名が {}に当てはめられて実行される。
\;はコマンドrmの終りを表す。
この例では見つかったファイルは黙って消されてしまうので注意すること。
ファイルを消すかどうか確認したい場合は rm の代わりに rm -i を使う。
- ファイルが変更された日時によってファイルを探す。
-mtime オプションによりいつファイルのデータが変更されたかによってファイルを探すことができる。
例えば、2 日(2*24 = 48時間)以内に変更されたファイルを探すには以下のように実行する。
% find . -mtime -2
-2を+2にすると2 日より前に変更されたファイルを探す。
- あるファイルより新しく作られたか書き換えられたファイルを探す。
-newerオプションの後にファイル名を指定する。
以下の例では、oldfile が作成・変更された時より後に作成・変更されたファイルが表示される。
% find . -newer oldfile
- ファイルの大きさによって探す。
-size オプションによってサイズがある大きさより大きい(+)・小さい(-)・等しいファイルを探すことができる。
探す時のサイズの単位は c をつけるとバイト単位になる。
(k をつけるとキロバイト単位)
1024 バイト以上の大きさのファイルを探す例。
% find . -size +1024c
練習課題
参考
Prev
Home | Contents
abe@injapan.net