Linuxでのファイル検索方法とその応用

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の有無を実行直前にも検証します。

公式情報・参考資料

この記事を書いた人

実務の現場で詰まりがちなポイントを地図にするITブログ「IT trip」を運営。Windows/Office(Teams・Excel)からSQL、サーバ運用、ガジェットまで、再現性のある手順と“なぜそうなるか”を丁寧に解説します。読んだらすぐ試せること、そして迷った人の次の一歩が見えることを大切にしています。

コメント

コメントする

目次