本記事では、findコマンドでファイルを探す方法をまとめる。
書式
基本的な書式は
$ find dir expである。ここで検索を開始するディレクトリをdir、検索式をexpと書いています。
例えば、ホームディレクトリ以下にあるすべてのhtmlファイルを探したいときは
$ find ~/ -name '*.html'とすればよい。このようにファイル名で探したいときは、nameオプションを付けて、ファイル名を表す式を'*.html'などのように書けば良い。
他にも、ホームディレクトリ以下にあるファイルで、ちょうど2日前にアクセスされたすべてのファイルを探すときには
$ find -atime 2とすれば良い。atimeオプションは最後にアクセスされた日を指定するときに使う。その後に指定する数で、日にちを指定する。+や-を数の前に付けることで、「より大きい」、「より小さい」という意味になる。例えば、2日以内にアクセスしたファイルの場合は
$ find -atime -2となる。
オプション
使用可能なオプションを少し紹介します。
- -atime n
- ファイルが最後にアクセスされたのがちょうどn日前である。
- -mtime n
- ファイルが最後に修正されたのはちょうどn日前である。
- -newer file
- ファイルはfileより後に修正された。
- -size n
- ファイルの長さはnブロック(1ブロックは512バイト)である。
- -name nam
- ファイル名はnamである。
- -perm p
- ファイルのアクセスモードはpである。
- -user usr
- ファイルの所有者はusrである。
- -group grp
- ファイルのグループ所有者はgrpである。
実行例を少し紹介します。 ホームディレクトリ以下にある1Mバイトより大きいのファイルで、10日以内にアクセスされたすべてのファイルを探す。
$ find ~/ -size +2048 -atime -10
論理式
AND,NOT,ORおよびカッコによるグループ化を表現できます。上述のオプションをそのまま列挙するとすべてのオプションを満たすファイルを探しますから、明示的にANDは書きません。
o(アルファベットの小文字のオー)オプションはオプション同士のOR演算を表します。例えば、goo1ユーザあるいはgoo2ユーザの所有するファイルを探すには
$ find -user goo1 -o -user goo2とします。
オプションの前にエクスクラメーションマーク(!)を書くと、NOTを表します。例えば、ファイル名がtest.wav以外のwavファイルを探すには
$ find ! -name test.wav -name *.wav
とします。ただし、エクスクラメーションマークとnameオプションの間はスペースで間隔をあけてください。
バックスラッシュ丸カッコあるいは円マーク丸カッコで囲むことで、グループ化されます。例えば、goo1あるいはgoo2ユーザの所有するwavファイルを探すには次のようにします。
find \( -user goo1 -o -user goo2 \) -name *.wav
パーミッション
上述のオプション一覧に示されているようにpermオプションによって、パーミッションによるファイル探索を行います。その引数として与えられる数値(例えば、644、すなわちrw-r--r--のこと)によって、そのパーミッションに設定されているファイルを探します。
$ find . -perm 644
これを実行するとカレントディレクトリ(.)以下にあるファイルでパーミッションが644となっているものを列挙します。
数値の前にハイフンがあるときは、少なくとも指定アクセスモードを満たすファイルを検索する。例えば、ルートディレクトリ以下にある、誰でも書き込み可能なファイルのリストを表示するには次のようにします。
$ find / -perm -002
すなわち、ファイルのパーミッションでその他のユーザ(o)の書き込み権限が許可されているファイルを列挙します。
動作オプション
指定した検索式にマッチしたすべてのファイルに対して、一定の動作を指定することができます。指定できる動作オプションをいくつか紹介します。
- パス名を表示する。
- -exec cmd
- コマンドcmdを実行する。
- -xdev
- 検索を開始ディレクトリのファイルシステムに限定する。
- -prune
- 遭遇したディレクトリには降りない。
ユーザgoo1のホームディレクトリ以下にあるすべてのファイルに対して、所有ユーザをgoo2、所有グループをgoo2に変更するには次のようにします。
$ find /home/goo1 -exec chown goo2 {} \; -exec chgrp goo2 {} \;
コマンドの書式{}は、検索式にマッチしたファイルのパス名を示すために使われます。波カッコの中にはスペースなど入れないでください。また、コマンドの終わりにはバックスラッシュセミコロンを書いてください。
最後に、アルマジロ本に載っていたおもしろい応用例を1つ紹介します。インストール作業などのような一定の作業の間で修正、追加されたファイルを全部表示するには、次のようにします。まず、作業の前にファイルstarting_timeというを作成します
$ touch /tmp/starting_time
そして、何らかの作業を行った後に、次のコマンドを実行すれば良いのです。
$ find / -newer /tmp/starting_time
ただし、消去されたファイルは直接表示されませんが、修正されたディレクトリがリストアップされます。
参考文献
Unixシステム管理のVolume1の3章1節「一般コマンドを最大限に活用する」に詳しく書かれています。findは単にファイルを探すだけでなく、システム管理上とても便利なツールとして使えることが分かりました。紹介されていたのは、
- ディスクの使用を監視する。
- セキュリティ問題を起こす可能性のあるファイルのロケーションを突き止める。
- 再帰的なファイル操作を実行する。
0 コメント:
コメントを投稿