5.10. ファイルの検索 【find】

$ find [検索対象のパス][評価式」[アクション]

ファイルを検索するには、find コマンドを使用します。検索対象のパスを省略した場合は、カレントディレクトリ以下が検索対象となります。評価式には、検索するファイルの条件を定義します。アクションには、評価式にマッチした検索結果をどのように処理するかを指定します。デフォルトでは、ファイル名をフルパスで表示します。

単に find コマンドを実行した場合は、カレントディレクトリ以下の全ファイルを表示します。

$ find

検索対象のディレクトリを指定すれば、そのディレクトリ以下のファイルが検索対象となります。次の場合は、/home/taro ディレクトリ以下の全ファイルが表示されます。

$ find /home/taro

検索するファイルを指定する場合は、評価式にどのようなファイルを検索するのかという条件を定義します。例えば、ファイル名で検索する場合は、-name という評価式を使用します。以下の例では、/home/taro ディレクトリ以下にある拡張子が .txt のファイルを検索しています。

$ find /home/taro -name "*.txt"

代表的な評価式を以下に示します。

表 5-8. find コマンドの評価式

-atime nn 日前にアクセスされたファイルを検索します。
-ctime nn 日前にステータスが変更されたファイルを検索します。
-amin nn 分前にアクセスされたファイルを検索します。
-cmin nn 分前にステータスが変更されたファイルを検索します。
-empty空ファイル、または中身のないディレクトリを検索します。
-gid nグループID が n のファイルを検索します。
-group グループ名ファイルの所有グループで検索します。
-iname ファイル名ファイル名の大文字と小文字を区別しないで検索します。
-mmin nn 分前に修正されたファイル名を検索します。
-mtime nn 日前に修正されたファイル名を検索します。
-name ファイル名ファイル名で検索します。
-size nファイルのサイズが n のファイルを検索します。単位は n 後に続く文字が c ならばバイト、k ならばキロバイトとなります。
-type cファイルのタイプが c のファイルを検索します。c には、b(ブロックスペシャルファイル)、c(キャラクタスペシャルファイル)、d(ディレクトリ)、f(通常のファイル)、l(シンボリックファイル)などが指定できます。
-uid nユーザーID が n のファイルを検索します。
-user ユーザー名ファイルの所有者で検索します。

評価式の数値 n には、+n または -n のように演算子の指定が可能です。+nn より大きいこと意味し、-nn より小さいことを意味します。数値だけの場合は、ちょうど n と等しいことを意味します。

また、評価式は組み合わせて指定することも可能です。AND で評価したい場合は、そのまま続けて指定することができます。明示したい場合は、-a または -and で評価式をつなぎます。例えば、/etc ディレクトリ以下を対象に拡張子が .conf で、且つ 3日以内に更新されたファイルを検索するには、次のようにコマンドを実行します。ファイル名の指定には、ワイルドカードを使用することができます。

$ find /etc -name "*.conf" -mtime -3

OR で評価したい場合は、-o または -or で評価式をつなぎます。例えば、/etc ディレクトリ以下を対象に拡張子が .conf もしくは .cfg のファイルを検索するには、次のようにコマンドを実行します。

$ find /etc -name "*.conf" -o -name "*.cfg"

さらに、評価式を ( ) で囲むことで括弧内の評価式が優先して処理されます。拡張子が .conf もしくは .cfg のファイルで、且つ 3日以内に更新されたファイルを検索するには、次のようにコマンド実行します。( ) の前には、シェルとして判断されないように \ を指定していることに注意してください。

$ find /etc \( -name "*.conf" -o -name "*.cfg" \) -mtime -3

デフォルトでは、検索されたファイル名をフルパスで標準出力へ表示しますが、アクションを指定することで出力結果に対する処理が行えます。以下に代表的なアクションを示します。

表 5-9. find コマンドのアクション

-exec コマンド;検索後、コマンドを実行します。コマンドの後に {} を指定することで、検索結果をコマンドに引き渡すことができます。コマンドから ; までは、すべてコマンドの引数とみなされます。
-fprint ファイル名検索結果を指定したファイルへ保存します。
-fls ファイル名検索結果を ls コマンドのフォーマットで指定したファイルへ保存します。
-ls検索結果を ls コマンドのフォーマットで表示します。
-ok コマンド;-exec と同様にコマンドを実行するが、ユーザーに問い合わせながらコマンドを実行します。
-print検索結果をフルパスで標準出力に表示します。これがデフォルトです。

-exec を指定した実行例を示します。

# find /home -name core -exec rm {} \;

この例では、/home ディレクトリ以下に存在する core というファイルを検索し、その結果を rm コマンドのパラメータとして渡しています。つまり、/home ディレクトリ以下に存在する core というファイルは全て削除されます。; の前には、シェルとして判断されないように \ を指定していることに注意してください。