Linuxで特定の拡張子を探す基本形はfind 検索開始点 -type f -name '*.txt' -printです。検索開始点をホームや対象プロジェクトへ限定し、通常ファイルだけを対象にし、ワイルドカードを必ず引用符で囲みます。最初から/全体を走査すると、権限エラー、仮想ファイルシステム、別マウント、ネットワーク共有へ広がり、負荷と情報露出が増えます。まず件数とパスを読み取りで確認し、後続処理へ渡す場合は改行や空白を含む名前に耐える-print0または-exec ... {} +を使います。
拡張子は名前の末尾という慣習である
Linuxのファイル種別は拡張子だけで決まるわけではありません。report.txtの「.txt」は名前の一部で、実際の内容や実行可否とは別です。-name '*.txt'はベース名がパターンへ一致するかを調べます。ディレクトリ部分を含むパス全体へ一致させるものではなく、大文字の.TXTも既定では一致しません。
検索目的を「末尾が.txtの通常ファイル」「内容がテキストのファイル」「MIMEタイプがtext/plain」のどれかにします。本記事は名前による候補抽出を扱います。見つかった候補をfileなどで読み取り確認してから内容処理へ進めます。二重拡張子archive.tar.gz、末尾ドット、拡張子なし、隠しファイルも要件に含むかを先に決めます。
検索開始点と-type fを明示する
現在のディレクトリ以下ならfind . -type f -name '*.txt' -print、ホームのDocumentsだけならfind "$HOME/Documents" -type f -name '*.pdf' -printとします。-type fは通常ファイルだけを選び、同名のディレクトリ、FIFO、ソケット、デバイスを除外します。開始点を引用し、空白を含むディレクトリ名でも一つの引数にします。
GNU findの既定はシンボリックリンクをたどらない-Pです。リンク先ツリーまで必要だからと安易に-Lを付けると、想定外の領域、循環、別所有者のデータへ達します。リンク自体を探すなら-type l、リンク先の種別を評価する特殊要件は-xtypeの仕様を確認します。通常の拡張子検索は既定のままが安全です。
ワイルドカードをシェルから保護する
*.logはfindではなく、先にシェルが現在ディレクトリの名前へ展開する可能性があります。そのため-name '*.log'のように単一引用符で囲みます。引用しないコマンドがたまたま動くのは、現在位置に一致ファイルがない場合などに限られ、別ディレクトリで引数が増えて失敗または誤検索します。
findの-nameはシェルパターンであり正規表現ではありません。*は任意の並び、?は任意の一文字、角括弧は文字集合です。.txtという文字列を正規表現のようにエスケープする必要はありません。ブレース{txt,md}はfindパターン内で選択肢にならないため、複数条件は明示的に組み立てます。
大文字・小文字は-nameと-inameで選ぶ
正確に小文字.jpgだけならfind . -type f -name '*.jpg' -printです。.JPGや.Jpgも含めるならfind . -type f -iname '*.jpg' -printを使います。GNU Findutilsの公式説明では-inameが大文字・小文字を区別しない版です。結果が広がるため、上書き処理の前段では特に件数を確認します。
大文字小文字の判定はロケールの影響を受け得ます。ASCII拡張子だけを対象にした再現可能な自動処理では実行環境とロケールを記録します。一方、利用者ファイルの国際化された名前を扱うときにLC_ALL=Cを無条件指定すると、表示や照合が期待と変わります。代表的な非ASCII名を含むテスト用ツリーで確認します。
複数の拡張子を論理式でまとめる
JPEGとPNGの通常ファイルを探す例はfind . -type f '(' -iname '*.jpg' -o -iname '*.jpeg' -o -iname '*.png' ')' -printです。括弧を引用してシェルの構文から保護し、OR条件を一つのまとまりにします。-type fがすべての拡張子へ効く位置に置きます。
findでは暗黙のANDがORより強く結合します。括弧なしで-type f -name A -o -name Bと書くと、B側には-type fが効かず、さらに式の真偽により既定出力の理解も難しくなります。検索式の末尾に-printを明示し、小さなテストツリーで期待ファイルと対象外ファイルの両方を確認します。
深さと別ファイルシステムを制限する
直下だけならfind . -maxdepth 1 -type f -name '*.csv' -print、二階層までなら-maxdepth 2を使えます。これはGNU findの機能なので、他UNIXへの移植性が必要なら環境を確認します。深いビルド成果物や依存パッケージを除外したい場合、開始点自体を分けるか-pruneを正しい論理式で使います。
同じファイルシステム内に限定するGNU findの-xdev(-mount)は、/や大きな共有領域を調べるときの境界になります。ただしbind mountやコンテナ、スナップショットの見え方は環境依存です。仮想領域を避けたいだけで除外式を複雑化せず、可能なら目的ディレクトリを開始点にします。
サイズ条件の境界と単位を理解する
100MiBより大きいMP4候補はfind "$HOME/Videos" -type f -iname '*.mp4' -size +100M -printで探せます。GNU findのMは1,048,576バイト単位で、値は単位へ切り上げられます。+100Mは単純な「100,000,000バイト以上」と同じではありません。厳密な境界が必要ならc単位と仕様を確認します。
-sizeは基本的にstatのst_sizeを使うため、疎ファイルの見かけサイズと実使用ブロックは異なります。容量回収の候補探しならduの使用量と組み合わせますが、見つけた直後に削除しません。所有者、更新時刻、ハードリンク、プロセス利用中かを確認し、読み取り一覧を保管して承認された保守手順へ渡します。
更新時刻は24時間単位の丸めに注意する
「直近7日以内」の例としてfind . -type f -name '*.docx' -mtime -7 -printがありますが、-mtimeは経過した24時間区間を切り捨てて判定します。「今日の午前0時以降」と同義ではありません。GNU findの-daystartは今日の開始を基準に変えますが、その後に現れる時刻テストへだけ影響します。
分単位なら-mmin、基準ファイルとの比較なら-newer系を検討します。mtimeは内容更新、ctimeはinode状態変更で、作成時刻ではありません。バックアップ復元やコピーで時刻が保持/変更されることもあります。監査や証拠保全ではfind結果だけで変更者や発生時刻を断定せず、監査ログとアプリログを照合します。
権限エラーを隠さず範囲を直す
アクセスできないディレクトリでは「Permission denied」が標準エラーへ出ます。2>/dev/nullで全エラーを捨てると、検索できなかった領域を「一致なし」と誤認します。まず検索開始点と自身の権限を見直し、必要な業務データだけを管理者承認の読み取り権限で調べます。rootで全体検索することを初手にしません。
自動処理では標準出力と標準エラーを別ファイルへ記録し、findの終了状態とエラー件数を確認します。途中でマウントが外れた、ファイルが消えた、循環リンクがあった場合も結果は不完全です。機密ディレクトリ名がログへ残るため、保存先、閲覧者、保持期限も決めます。
後続処理はNUL区切りか-execを使う
画面で人が確認するだけなら-printで十分ですが、改行を含むファイル名を別コマンドへ渡すと行区切りでは壊れます。GNU findは-print0で名前の後ろにNULを出力し、対応するxargs -0などへ渡せます。例えば読み取り情報ならfind . -type f -name '*.txt' -print0 | xargs -0 -r stat --です。
より直接的にはfind . -type f -name '*.txt' -exec stat -- {} +とし、findがファイル名を引数として安全に渡します。{}をシェル文字列へ埋めてsh -cで再解釈させません。削除、移動、権限変更へ進む前に、同じ条件で-print0の候補を保存し、件数、ルート、対象外、バックアップ、ロールバックを確認します。
結果の再現性と変化を記録する
検索中にもファイルシステムは変わるため、findの一覧は一時点の完全なスナップショットではありません。開始/終了時刻、ホスト、開始点、コマンド、findの版、ロケール、マウント、終了状態を記録します。結果を再利用するならNUL区切りのまま保管するか、表示用へ明確に変換し、改行入り名前で曖昧にならないようにします。
大量結果は先頭数件だけで判断せず、wcなどで件数を確認し、拡張子別・ディレクトリ別の偏りを調べます。次工程がバックアップなら読み取り可能性と容量、解析なら文字コードと内容、削除なら所有者と保持要件を追加確認します。検索コマンド自体は候補抽出であり、発見したファイルを安全に処分できる根拠ではありません。
確認チェックリスト
- 検索開始点を目的ディレクトリへ限定した
- -type fで通常ファイルだけにした
- ワイルドカードを引用符で囲んだ
- -nameと-inameを要件で使い分けた
- 複数拡張子のOR条件を括弧でまとめた
- -sizeと-mtimeの単位・丸めを理解した
- 権限エラーを捨てず不完全結果を識別した
- 後続処理は-print0/-execで安全に渡した

コメント