Findコマンドを使いこなそう  

使い慣れた人には便利なFindコマンド。一方、使えるオプションが多いためなかなか敷居が高いコマンドです(たぶん)。
Findコマンドは単にファイルを検索するだけではなく、条件に合うファイルに対して一気に処理を行うことができる強力なプログラムです。このページではそんなFindコマンドの使用例を挙げながら解説してみます。
なお、オプションの説明はhttp://www.linux.or.jp/JM/html/GNU_findutils/man1/find.1.htmlを参考にしました(というかオプションの解説は一部引用しています)。全てのオプションはこのMANPAGEを参考にして下さい(オプションが多すぎてちょっとわかりにくいですが・・・)。用語等もできるだけあわせてあります。

パターンに一致するファイルを圧縮  

ディレクトリ以下のパターンに一致するファイルに対して圧縮処理を行い、処理中のファイルを表示します。

% find ./ -name "semet1_00???.img" -exec bzip2 -v {} \;

この場合、semet1_000001.imgといったファイルに対して処理を行います。bzip2 semet1_00???.imgと異なるのはディレクトリ以下をすべて検索する点です。

% find ./ -name "*.img" -exec bzip2 -v {} \;

とすれば現在のディレクトリ以下の.imgファイルをすべて処理することができます。

未来のファイルをTouch!!  

何らかの理由で未来のファイルが作成されてしまうことがありますが、Findでそれらのファイルを探し出し、touchします*1

ext3ファイルシステムでは3種類の時刻が記録されています

  • 最終アクセス時刻(atime; access time) -- ls -uで表示される
  • 最終修正時刻(mtime; modify time) -- lsで表示される
  • 最終状態変更時刻(ctime; change time) -- ls -cで表示される
それぞれが更新されるタイミング
  • 読み込んだときに更新される -- atime
  • 書き込んだときに更新される -- atime, mtime, ctime
  • chmod, chownなどで属性変更したときに更新される -- ctime

カレントディレクトリ以下のファイルで、未来の時刻を示している場合にtouchする場合以下の様にします。

% find ./ \( -amin -0 -o -mmin -0 -o -cmin -0 \) -exec touch {} \;

シンボリックリンクを追いかけて処理する場合は-followを追加します。

% find ./ -follow \( -amin -0 -o -mmin -0 -o -cmin -0 \) -exec touch {} \;

評価式  

膨大な数ありますが、とりあえずよく使うようなものを載せておきます。

オプション内容
-daystart-atime,-mtime,-ctimeの時間の基準を24時間前ではなく、コマンドを実行した日の0時にする
-followシンボリックリンクの参照先を検索する
-maxdepth levelspathから降りて検索するディレクトリレベルの最大値を指定する(levelsは非負の整数)。
-maxdepth 0pathのみを評価し、アクションの対象にすることを意味する。-maxdepth 1のときはpathの直下のみ
判別式内容
名前
-name patternシェルのパターン'patternに一致すれば真
例:-name "semet1_00???.img"
更新時刻に関する式
-amin N最終アクセス時刻がN分前であれば真
-atime N最終アクセス時刻が(N x 24)時間前であれば真
-anewer filefileが修正された以降にアクセスされたファイルに対して真を返す
-mmin N最終修正時刻がN分前であれば真
-mtime Nファイルのデータが最後に修正されたのが(N x 24)時間前なら真
-newer fileファイルfile以降に修正されたファイルに対して真を返す
-cmin N最終状態変更時刻がN分前であれば真
-ctime Nファイルのステータスが最後に変更されたのが(N x 24)時間前であれば真
-cnewer filefileが修正された以降にファイルステータスが変更されたファイルに対して真を返す
-atime,-mtime,-ctimeは-daystartで動作が変わる
-anewer,-newer,-cnewerはコマンドライン上でそれより前に指定されている場合に限り、-follow による影響を受ける
アクション内容
-exec command \;コマンドを実行する。{}がファイル名に置換され、commandの終わりは\;で表す。
例:-exec touch {} \;
-ls現在のファイルをls -dils形式で出力する
演算子内容
\( \)カッコの中が先に評価される
式1 -o 式2OR

数値の表し方

+NNより大きい-amin +10 : 10分前より以前にアクセスされた
-NNより小さい-amin -10 : 10分前より以降にアクセスされた
NNと等しい-amin 10 : 10分前にアクセスされた

その他、-amin -0で現在時刻より未来となります。正負の向きがややこしいですが、そういうことのようです。なお-amin 0だと現在時刻と等しい、を示しますので結果が異なるので注意!

*1 touchコマンドでファイル内容を変更することなくタイムスタンプを変更します。ディフォルト動作では存在しないファイルを指定すると空のファイルができます。