Linux / コマンド / find - 条件でファイルとディレクトリを検索

findは、指定した開始パスを直接巡回しながら条件に合うファイルやディレクトリを探すコマンドです。名前だけでなく種類、サイズ、修正時刻、権限を組み合わせ、結果に対してコマンドを実行できます。

この記事ではfindの基本的な文法と主なオプション、実際の使用例、関連コマンドとの違い、使用時の注意点について説明します。

findコマンドとは?

基本構造は開始点、式の順番です。式はテスト(test)、論理演算子、動作(action)で構成され、演算子の優先順位に従い、必要な範囲が左から右に評価されます。別途動作を指定しない場合、一致したパスを出力する-printが適用されます。

基本的な文法

find [開始パス ...] [式]

オプションや詳細な動作は実装やバージョンによって異なる場合があります。現在のシステムではfind --helpとman findでインストールされたコマンドの説明を確認してください。

findの基本的な使い方

名前で検索

シェルがワイルドカードを先に展開しないよう、パターンを引用符で囲みます。

find . -name '*.log'

種類とサイズで検索

-type fは通常のファイル、-size +100Mは100MiBより大きいファイルを意味します。

find /var -type f -size +100M

修正時刻で検索

-mtime は通常、経過時間を24時間で割り、小数部分を切り捨てた値を使います。-mtime 0 は24時間未満、-mtime 1 は24時間以上48時間未満です。分単位には-mminを使用します。

find /srv/app -type f -mmin -60

検索範囲と結果パスを確認する

findは指定した開始ディレクトリ以下を実際に探索します。パターンを引用符で囲み、シェルが先に展開しないようにします。

mkdir -p demo-find
touch demo-find/a.txt
find demo-find -name '*.txt'

例の出力:

demo-find/a.txt

基本出力には開始パスを含むパスが表示されます。-deleteや-execと組み合わせる前に、照会結果に意図したファイルだけが含まれているかをまず確認してください。

主なオプション

オプション 説明
-name PATTERN 大文字小文字を区別してファイル名パターンを検査します。
-iname PATTERN 大文字小文字を区別せずにファイル名パターンを検査します。
-type TYPE f、d、lなど、ファイル種類を制限します。
-maxdepth N 開始点で検索する最大深さを制限します。
-mtime N 変更時刻を24時間単位で確認します。
-size N ファイルサイズ条件を適用します。
-exec ... {} + 一致するパスをまとめ、シェルでファイル名を再解釈せずに外部コマンドの引数へ渡します。
-delete 一致する項目を削除します。条件と順序を十分に検証する必要があります。

実践的活用例

空のディレクトリとファイルを探す

-emptyは空の通常ファイルと空のディレクトリの両方に一致する可能性があるため、種類も一緒に指定します。

find . -type d -empty -print

一致するファイルを一括処理する

ファイル名に空白や改行があっても安全にするために-exec ... {} +を使用します。

find . -type f -name '*.tmp' -exec ls -l -- {} +

削除する前に対象を確認する

以下は、自分が所有する削除専用の練習用 cache だけで試します。最初の表示で対象を確認し、同じ開始パスと条件で削除します。-mtime +30 は整数部分が30を超える、つまり31×24時間以上前の変更が対象です。-delete は自動で -depth を有効にするため、表示時も同じ探索順に合わせています。

find ./cache -depth -type f -mtime +30 -print
find ./cache -type f -mtime +30 -delete

findと関連コマンドの比較

コマンド 主な役割 適した状況
find リアルタイムのパス巡回 精密な条件と操作
locate インデックスデータベースの検索 高速な名前検索
which PATHで実行ファイルを検索 実行される外部コマンドを確認
grep -R ファイル内容を検索 テキストパターンを探す

使用する際の注意点

パターンを引用符で囲む

*.logをそのまま使うと、現在のシェルが先に展開して予期しない検索になる可能性があります。

-deleteはすぐに削除します

パスと条件を -print で検証し、リンクやマウント境界も確認します。既定ではシンボリックリンクの先はたどりません。-delete は確認を求めず、-depth によって -prune が機能しなくなるため、両者を組み合わせて除外できると考えないでください。表示と削除の間に対象が変わる可能性も残ります。

演算子の優先順位を確認する

条件を続けた場合のANDは -o(OR)より優先されます。例えば find . -type f \( -name '*.log' -o -name '*.txt' \) -print のように名前の条件をまとめ、括弧をバックスラッシュで保護してください。

FAQ

サブディレクトリまで自動的に検索しますか?

はい。基本的に開始パスの下を再帰的に巡回します。

ファイル名で大文字小文字を無視するには?

GNU findでは-inameを使用します。

空白のあるファイルを安全に処理するには?

-exec コマンド {} +または-print0とNUL入力をサポートするツールを組み合わせます。

locateより遅い理由は何ですか?

findは現在のファイルシステムを直接巡回しますが、locateは事前に作成されたインデックスを参照するためです。

参考資料