Linuxでのファイル検索方法とその応用で重要なのは、実行例を増やすことより、対象と戻し方を先に確定することです。結論は「現在状態を条件付きで探すならfind、候補pathを高速に探すならlocateを使い分けます。検索root、-type、name、mtime、sizeを段階的に絞り、最初は-printだけにします。」。ここではfindは現在のdirectory treeを走査し、locateは更新時点のdatabaseを検索するため鮮度と権限の意味が違う条件を前提に、2026年7月17日時点の公式仕様から、現場で再現できる判断順を組み立てます。 確認ポイント:findはlive traversal、locateは更新時点のdatabase検索なので、結果の鮮度が異なります。
検索root・name pattern・type・境界を固定する
find、locate、command -vの入力、出力、変更有無を一文で書き、host、user、current directory、実行時刻を添えます。版が違う端末の結果を混ぜず、同じ条件のsampleで再現してから対象を広げます。
- 検索rootとfilesystem境界を決める
- name、type、time、size条件を仕様化する
- symbolic linkとpermission errorの扱いを決める
- locate databaseの更新時刻を確認する
確認値が空、過剰、読めない場合はhelpとsampleへ戻ります。推測した値を補完して実行しません。
findのlive探索とlocateのDB検索を分ける
nameとtypeで検索
find ./project -type f -name '*.conf' -print
wildcardをquoteしてshell展開を防ぎます。
更新時刻とsizeを追加
find ./logs -type f -mtime -7 -size +10M -print
findのday単位丸めとsize単位を公式manualで確認します。
不要directoryをprune
find ./project -path './project/.git' -prune -o -type f -name '*.md' -print
operator precedenceを括弧または順序で明確にします。
filesystemをまたがない
find /var -xdev -type f -name '*.log' -print
mount境界を越えない調査に使います。
locateで候補を高速表示
locate -- '*.service'
databaseが古い可能性があるため、候補はstatやfindで現存確認します。
match件数とfind終了statusを別々に読む
findのexpressionは左から評価され、actionを省略すると-printが既定になる条件があります。-mtimeは24時間単位の丸め、-sizeは指定単位のroundingに注意します。locateはdatabase snapshotなので、削除済みpathや新規fileが反映されないことがあります。
表示行だけでなく終了code、件数、object型を確認します。pipelineの途中失敗が最終表示に隠れていないかも見ます。
findのactionを-printでpreviewする
最初は-printまたは-print0だけにし、-deleteや-execによる変更を混ぜません。rootを/へ広げる前に対象mountと権限を確認し、network filesystemやpseudo filesystemの負荷を避けます。file名を後続へ渡すときはNUL区切りを使います。
復元用copyはhash、owner、modeまたはACLまで照合します。失敗時は追加変更を止め、記録した元状態へ戻します。
prune・xdev・shell globの誤りを避ける
- wildcardをquoteせずshellに展開させる
- find expressionの-and/-or precedenceを誤る
- locate結果を現在存在するfileと断定する
- permission deniedを0件として扱う
- file名の空白・newlineをline区切りで壊す
切り分けでは一度に一条件だけ変え、別hostや別userの結果を混ぜません。
検索式・version・時刻・件数を記録する
通常名、space、newline、leading dash、symlink、read不可directoryのsample treeを作ります。期待path一覧とfind出力、stderr、終了codeを比較し、locate候補はstatで現存確認します。
Linuxでのfile検索を定期化するなら、正常件数、警告境界、停止条件を数値化します。
古いlocate DBと広すぎるrootで停止する
Linuxでのfile検索の開始記録には「検索rootとfilesystem境界を決める」を最初に置きます。続けて「name、type、time、size条件を仕様化する」を確認すると、対象違いと環境違いを作業前に分けられます。
対象範囲を確定する段階では「symbolic linkとpermission errorの扱いを決める」が判断材料になります。また「locate databaseの更新時刻を確認する」を満たさない場合は、技術的に実行できても運用上の準備不足です。
実例のうち「nameとtypeで検索」はbaselineを得る用途、「更新時刻とsizeを追加」は対象をさらに具体化する用途として使い分けます。両方の出力を同じ形式へ無理に整形せず、元の型と件数を保持したまま比較します。期待値は画面の見た目ではなく、対象ID、path、時刻など再照合できる列で定義します。
find の式は、空白を含む名前、除外directory、symbolic link、別filesystemへのmountを含む検証ツリーで確認します。特に -prune と -o は評価順序を括弧で明示し、最初は -print だけで対象一覧を点検してください。-xdev を使う場合も意図したmount境界が除外されるか確かめ、削除や変更のactionは一覧確認後の別工程に分けます。
locate は事前作成されたdatabaseから候補を高速表示しますが、作成後に追加・削除されたpathは反映されないことがあります。現在の存在や権限を確かめる用途では、候補を test -e や限定した find で再確認してください。共有環境で updatedb を任意実行すると負荷や情報公開範囲へ影響するため、既存の更新scheduleと管理方針に従います。
再試行の前に、wildcardを引用せずshellへ展開させていないか、find式のAND・ORの優先順位を誤っていないか確認します。-prune を含む式は括弧で範囲を明示し、locateの候補を現在存在するfileだと断定しません。
最初の確認は -print または -print0 だけにし、-delete や -exec で変更しません。filenameに空白・改行・先頭dashがあっても境界を保てるよう、自動処理ではNUL区切りを使います。permission deniedを0件として扱わず、標準エラーと終了値を確認します。
再現記録にはfind/locateの実装とversion、検索root、PWD、完全な式、locale、mount境界、終了値、件数、読み取りエラーを含めます。locateを使った場合はdatabaseの更新時刻も記録します。表示だけならrollbackは発生しません。
完了条件は、既知の対象fileが含まれ、除外directory、symbolic link、別filesystemが指定どおり扱われることです。空白と改行を含むfixtureでも件数が崩れず、読めなかったpathとstaleなlocate候補を結果から区別できることを確認します。
findの結果を別commandへ渡すときは、空白や改行を含むpathを壊さないよう-print0とxargs -0、または-exec … {} +を使います。-pruneは評価順序で結果が変わるため、除外directoryを左側に置いて-o以降へ検索条件を書く形をsample treeで確認します。検索から処理までの間に対象が差し替わる可能性もあるので、重要な変更処理では所有者、type、symlinkの有無を実行直前にも検証します。

コメント