findコマンドの応用

1月 3, 2010

多機能なfindコマンド(多機能すぎて覚えられない、、)の応用編、ほんの一例。

-or 検索。
基本要素を括弧で囲んでおけば複数並べる事が出来る。
ただし括弧は¥でエスケープしておくこと。
以下は、カレントディレクトリ以下で拡張子が .png か .jpg のファイルを検索。

# find . -type f ¥( -name “*.png” -or -name “*.jpg” ¥) -print


findコマンドにはファイル内部のテキストを検索する機能はなく、find | grep コマンドは
使用できないが、find | xargs grep とすればよい。

例:「UNIX」文字列を含む内容のhtmlファイルを検索

# find . -name “*.html” -print0 | xargs -0 grep -i UNIX
※ファイル名に空白が含まれているとエラーになるので、それを避けるために-print0を指定。xargsにも-0オプションをつける。


-notをつけることで論理を反転させる。¥!でも同様。
以下はgzファイルでなく、空でないファイルを指定している。

# find /var/log -not -name “*.gz” -type f -size +0 -print


さらに、ファイル内にwarning文字列が含まれるファイルを検索して書き出す。

# find /var/log -not -name “*.gz” -type f -size +0 -print | xargs grep -i warning


指定した拡張子のファイルに対してだけ検索をかける例。以下、どちらでも。

# find . -name “*.log” | xargs grep -i error
# grep -i error `find . -name “*.log”`


-execも忘れてはいけない。しかしrmやmvは慎重に。。

# find . -name “*.log” -exec rm {} ¥;


-execとxargsの違いはというと、以下の仕様によりxargsの方が処理が高速になるらしい。

-exec 処理すべきコマンドを1つずつ渡す
※検索結果のファイル数の回数分、コマンドが実行される
xargs 処理すべきコマンドをまとめて渡す


このへん、ARG_MAXとやらが絡んでくるらしいが、追求している時間がない。
xargsについては以下リンクに詳しく書いてある。今度ゆっくり読もう。。
↓ ↓ ↓
いまさらxargsの便利さを主張してみる
xargs 標準入力から引数を読み込み、指定のコマンドを実行する(UNIXの部屋)

Categories: Linuxコマンド

No Responses so far | Have Your Say!

Comments are closed.