findコマンドの応用
多機能な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の部屋)