Linuxユーザの立場から、役立つ情報や困ったときの解決方法を分かりやすく、かつ簡潔に記事にまとめています。主に、Ubuntu 8.04(→9.04)やCentOS 5.2(→5.3)で確認したことですが、他のディストリビューションでも応用できると思います。内容は(1)設定ファイルの書き方(2)役立つソフトウェア紹介やインストール方法(3)便利なコマンドの使い方や活用例(4)困ったときの解決方法です。このページの末尾にキーワード別で記事を分類してあります。また、真上の「ブログ検索」フォームからブログ内の記事を検索できます。

2009年2月28日土曜日

findコマンドでファイルを探す このエントリーを含むはてなブックマーク

本記事では、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)の書き込み権限が許可されているファイルを列挙します。

動作オプション

指定した検索式にマッチしたすべてのファイルに対して、一定の動作を指定することができます。指定できる動作オプションをいくつか紹介します。

-print
パス名を表示する。
-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 コメント:

キーワード

キーワード別に記事を分類してあります。クリックすると各キーワードに該当する記事たちが表示されます。

筆者について

自分の写真
趣味はコンピュータ、音楽、写真などです。