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