こんにちは、Bash玄(ばっしゅげん)です。
Linuxサーバーの運用やスクリプト開発で、「30日以上前の古いログファイルを一括削除してディスクを空けたい」「100MB以上の大容量ファイルがどこにあるか調査したい」「特定の拡張子を持つファイルだけパーミッションを変更したい」という場面は日常茶飯事です。手作業でディレクトリを一つずつ潜って探すのは時間がかかりますし、作業漏れのリスクもあります。そこで必須となるのが find コマンドです。
この記事では、find コマンドの基本構文から主要オプション早見表、さらに実務で即コピペして使える18の実践パターン(ファイル名・日付・サイズ検索、-exec / xargs 一括処理など)と安全対策まで徹底解説します。
- 1. 最短で動かす基本構文
- 2. find 主要オプション・検索条件早見表
- 3. 実務で使える頻出パターン集(コピペ実例18選)
- 3.1 30日以上前の古いログファイルを一括削除する(安全な確認手順付き)
- 3.2 100MB以上の大容量ファイルを特定して一覧表示する(du/ls連携)
- 3.3 パーミッション(777など)で危険なファイルを抽出する(-perm)
- 3.4 複数の拡張子(.jpg と .png)を OR 条件で検索する(-o オプション)
- 3.5 検索結果を xargs に安全に渡す(-print0 と xargs -0)
- 3.6 特定のディレクトリ(.git や node_modules)を除外して検索する(-prune)
- 3.7 直近24時間以内(または60分以内)に更新されたファイルを調査する
- 3.8 ディレクトリ階層の深さを1階層(直下のみ)に限定する(-maxdepth 1)
- 3.9 空のファイル・空ディレクトリを洗い出して整理する(-empty)
- 3.10 特定ユーザー・グループが所有するファイルのみ抽出する(-user / -group)
- 3.11 特定の日付・特定ファイルより新しいファイルを検索する(-newer / -newermt)
- 3.12 実行権限のあるスクリプトファイルのみ抽出する(-executable)
- 3.13 リンク切れのシンボリックリンクを検出する(-xtype l)
- 3.14 検索結果のファイル内容を grep で一括文字列検索する
- 3.15 ディレクトリには755、ファイルには644を一括適用する(chmod連携)
- 3.16 条件に一致しないファイルを除外して検索する(! / -not)
- 3.17 検索結果のファイル数(件数)をカウントする(wc -l 連携)
- 3.18 検索結果を別ディレクトリへ一括コピー・移動する(-exec cp/mv 連携)
- 4. よくあるエラー・落とし穴と安全対策
- 5. まとめ & 関連記事
- 関連記事
1. 最短で動かす基本構文
find コマンドの基本構文は非常にシンプルです。指定した探索起点ディレクトリから再帰的(サブディレクトリを含む)にファイルを探索します。
# 基本構文
find [検索ディレクトリ] [検索条件] [アクション]
例えば、カレントディレクトリ配下にあるすべての通常ファイルを一覧表示する最小のコマンドは次のとおりです。
# カレントディレクトリ(.)配下の通常ファイル(-type f)を検索
find . -type f
まず押さえるべきファイル名検索(-name と -iname)
最もよく使うのがファイル名指定の -name オプションです。大文字・小文字を区別せずに検索したい場合は -iname(ignore case)を使用します。
# 大文字小文字を区別して .log ファイルを検索
find /var/log -type f -name "*.log"
# 大文字小文字を区別せずに readme や README を検索
find . -type f -iname "readme*"
実務での鉄則として、ワイルドカード(* や ?)を使う際は必ずダブルクォート "*.log" で囲むようにしてください。クォートを忘れると、コマンド実行前にシェル自身がカレントディレクトリのファイル名に展開してしまい、意図しない検索結果やエラーの原因になります。
2. find 主要オプション・検索条件早見表
実務で頻出する find コマンドのオプション・条件指定・アクションをまとめました。迷ったときはこの表から必要な条件を組み合わせてください。
| 条件指定 / オプション | 機能・意味 | 実用例 |
|---|---|---|
-name "pattern" | ファイル名で検索(大文字小文字区別あり) | find . -name "*.log" |
-iname "pattern" | ファイル名で検索(大文字小文字区別なし) | find . -iname "readme.txt" |
-type f / d / l | ファイル種類(f=ファイル, d=ディレクトリ, l=リンク) | find . -type f |
-mtime +N / -N | 更新日時(+N=N日以前より古い, -N=N日以内) | find /var/log -mtime +30 |
-mmin +N / -N | 更新日時(分単位:+N=N分前より古い, -N=N分以内) | find /tmp -mmin -60 |
-newer file | 指定ファイルより新しいファイルを検索 | find . -newer timestamp.txt |
-size +N / -N | ファイルサイズ(k=KB, M=MB, G=GB) | find /var -size +100M |
-perm MODE | パーミッションで検索(完全一致または /MODE) | find . -perm 777 |
-user / -group | 所有ユーザー名 / 所有グループ名で検索 | find /home -user nginx |
-maxdepth N | 検索するディレクトリ階層の最大深さを制限 | find . -maxdepth 2 -name "*.conf" |
-mindepth N | 検索を開始する最小の深さを指定 | find . -mindepth 2 -type f |
-empty | サイズ0の空ファイルや空ディレクトリを検索 | find /tmp -type f -empty |
-path "dir/*" -prune | 特定ディレクトリを検索対象から除外 | find . -path "./node_modules" -prune -o -type f -print |
-exec CMD {} + | 検索結果をまとめてコマンドに渡して実行(高速) | find . -name "*.tmp" -exec rm {} + |
-exec CMD {} ; | 検索結果のファイルごとに1回ずつコマンド実行 | find . -name "*.sh" -exec chmod +x {} ; |
-delete | マッチしたファイルを直接削除 | find . -name "*.bak" -delete |
-print0 | ヌル文字区切りで出力(xargs -0 連携用) | find . -type f -print0 | xargs -0 rm |
3. 実務で使える頻出パターン集(コピペ実例18選)
サーバー運用や日常の開発業務でそのまま使える実践的なワンライナーを18個厳選しました。
3.1 30日以上前の古いログファイルを一括削除する(安全な確認手順付き)
ログローテーションの対象外になっているディレクトリや、不要な古いバックアップを掃除する定番パターンです。いきなり削除せず、まず一覧表示で対象を確認してから削除を実行するのが現場の鉄則です。
# 【Step 1: 事前確認】30日以上前(+30)に更新された .log ファイルを一覧表示
find /var/log/app -type f -name "*.log" -mtime +30 -ls
# 【Step 2: 削除実行】安全確認後、一括削除(-exec rm {} +)
find /var/log/app -type f -name "*.log" -mtime +30 -exec rm {} +
3.2 100MB以上の大容量ファイルを特定して一覧表示する(du/ls連携)
ディスク容量アラートが発生した際、どのファイルが容量を圧迫しているかを素早く特定するコマンドです。du と sort を連携させ、容量の大きい順にトップ10を出力します。
# 100MBを超える(+100M)ファイルを検索し、容量順に上位10件を表示
find /var -type f -size +100M -exec du -sh {} + 2>/dev/null | sort -hr | head -n 10
3.3 パーミッション(777など)で危険なファイルを抽出する(-perm)
セキュリティ監査や公開Webサーバーで、誰でも書き込み可能なパーミッション(777 等)になってしまっている危険なファイルを検出します。
# 権限が 777 のファイルを抽出して詳細一覧を表示
find /var/www -type f -perm 777 -ls
# 検出された777ファイルの権限を安全な 644 に一括修正
find /var/www -type f -perm 777 -exec chmod 644 {} +
3.4 複数の拡張子(.jpg と .png)を OR 条件で検索する(-o オプション)
画像ファイルや複数のログ拡張子をまとめて検索する場合は -o(OR条件)を使用します。条件の優先順位を明確にするため、括弧 ( ... ) でエスケープしてグループ化します。
# .jpg または .png の通常ファイルを検索
find /var/www/uploads -type f ( -name "*.jpg" -o -name "*.png" )
3.5 検索結果を xargs に安全に渡す(-print0 と xargs -0)
ファイル名にスペース(空白)、改行、日本語などが含まれている場合、通常のパイプ渡しでは意図せずファイル名が途中で分割されて事故につながります。-print0 と xargs -0 をセットで使うことで、ヌル文字(