findコマンドはファイルやディレクトリなどを探し出すだけではなく,検索結果をファイルとして保存したり,他のコマンドと組み合わせて使うことで,より便利に使えます。

検索結果を詳細表示する

 検索したファイル名のほかに,パーミッション,所有者,容量などを同時に表示させたい場合は,アクション(表1)に「-ls」を指定します。

表1●findで利用できる主なアクション
表1●findで利用できる主なアクション

例えば,1Mバイト以上のファイルを検索し,詳細な情報を一覧表示するには,次のように実行します。

$ find ./ -size +1024k -ls

検索したファイルを他のコマンドで処理する

 検索結果に対してほかのコマンドで処理したい場合は,findコマンドのアクションに「-exec コマンド \;」(\は,半角のバックスラッシュの場合もある。以下は,バックスラッシュで表現)を指定します。また,検索結果のファイル名は「{ }」で置き換えられます。

 例えば,拡張子がtxtのファイルをdocディレクトリに移動するには,以下のように実行します。

$ find ./ -name *.txt -exec mv {} doc ;

 「-exec」を「-ok」に変更すると各検索結果をコマンドで処理する前にユーザーに実行するか否かを聞くようになります。例えば,最終アクセス時間が30日より以前のファイルをユーザーに確認してから削除するには,以下のように実行します。

$ find ./ -atime +30 -exec rm {} old ;

高速にファイルを検索する

 findコマンドは対象となるファイルやディレクトリすべてを検索するため,検索時間が長くなりがちです。ファイル・システム上にあるファイルすべてを対象にすると,数分から数十分も検索時間がかかることがあります。

 そこで高速に検索を行いたい場合は,locateコマンドを利用します。locateコマンドはあらかじめファイルやディレクトリのデータベースを作成しておき,それを利用して検索します。

 mydoc.txtを検索したい場合は,

$ locate mydoc.txt

と実行します。すると,ファイルやディレクトリの名前にmydoc.txtを含むものが一覧表示されます。

 ただし,locateコマンドはファイル名やディレクトリ名のみについて限定した検索が行え,findコマンドのようなファイル種別やパーミッションなどでの検索は行えません。また,ファイル名にワイルド・カードも使えません。ワイルド・カードを使って検索を行いたい場合は,locateで大まかにファイルを検索し,その結果をgrepで絞り込むとよいでしょう。例えば,/home/fukudaディレクトリ内にある,ファイル名がPから始まり,拡張子にjpgを持つファイルを検索する場合は,

$ locate /home/fukuda | grep "^/home/fukuda/.*P.*.jpg$"

などと実行します。

 locateコマンドを利用するにはあらかじめデータベースを作成しておく必要があります。データベースの作成には,updatedbコマンドを利用します。ただし,updatedbコマンドは管理者のみが実行可能なコマンドです。通常,Linuxディストリビューションではupdatedbコマンドを午前4時ごろに実行するように設定されています。また,updatedbコマンドの実行以降に作成されたファイルやディレクトリはlocateコマンドでの検索対象にはなりません。

各コマンドの詳しい使い方などについては,「Linuxコマンド集」を参照ください。また,「Linuxコマンド逆引き大全」で,行いたい処理内容からコマンドの使い方を調べられます。