【findコマンド早見表】ファイル検索・日付・サイズ指定と-exec一括処理の実務パターン18選

コマンドリファレンス

こんにちは、Bash玄(ばっしゅげん)です。

Linuxサーバーの運用やスクリプト開発で、「30日以上前の古いログファイルを一括削除してディスクを空けたい」「100MB以上の大容量ファイルがどこにあるか調査したい」「特定の拡張子を持つファイルだけパーミッションを変更したい」という場面は日常茶飯事です。手作業でディレクトリを一つずつ潜って探すのは時間がかかりますし、作業漏れのリスクもあります。そこで必須となるのが find コマンドです。

この記事では、find コマンドの基本構文から主要オプション早見表、さらに実務で即コピペして使える18の実践パターン(ファイル名・日付・サイズ検索、-exec / xargs 一括処理など)と安全対策まで徹底解説します。

  1. 1. 最短で動かす基本構文
    1. まず押さえるべきファイル名検索(-name と -iname)
  2. 2. find 主要オプション・検索条件早見表
  3. 3. 実務で使える頻出パターン集(コピペ実例18選)
    1. 3.1 30日以上前の古いログファイルを一括削除する(安全な確認手順付き)
    2. 3.2 100MB以上の大容量ファイルを特定して一覧表示する(du/ls連携)
    3. 3.3 パーミッション(777など)で危険なファイルを抽出する(-perm)
    4. 3.4 複数の拡張子(.jpg と .png)を OR 条件で検索する(-o オプション)
    5. 3.5 検索結果を xargs に安全に渡す(-print0 と xargs -0)
    6. 3.6 特定のディレクトリ(.git や node_modules)を除外して検索する(-prune)
    7. 3.7 直近24時間以内(または60分以内)に更新されたファイルを調査する
    8. 3.8 ディレクトリ階層の深さを1階層(直下のみ)に限定する(-maxdepth 1)
    9. 3.9 空のファイル・空ディレクトリを洗い出して整理する(-empty)
    10. 3.10 特定ユーザー・グループが所有するファイルのみ抽出する(-user / -group)
    11. 3.11 特定の日付・特定ファイルより新しいファイルを検索する(-newer / -newermt)
    12. 3.12 実行権限のあるスクリプトファイルのみ抽出する(-executable)
    13. 3.13 リンク切れのシンボリックリンクを検出する(-xtype l)
    14. 3.14 検索結果のファイル内容を grep で一括文字列検索する
    15. 3.15 ディレクトリには755、ファイルには644を一括適用する(chmod連携)
    16. 3.16 条件に一致しないファイルを除外して検索する(! / -not)
    17. 3.17 検索結果のファイル数(件数)をカウントする(wc -l 連携)
    18. 3.18 検索結果を別ディレクトリへ一括コピー・移動する(-exec cp/mv 連携)
  4. 4. よくあるエラー・落とし穴と安全対策
    1. 4.1 ワイルドカード(*)のダブルクォート囲み忘れ
    2. 4.2 -exec CMD {} ; と -exec CMD {} + のパフォーマンス差
    3. 4.3 誤削除を防ぐための事前確認(ドライラン手順)
    4. 4.4 Permission denied の標準エラー出力を抑制する
  5. 5. まとめ & 関連記事
    1. 関連コマンド記事(あわせて読みたい)
  6. 関連記事

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パーミッションで検索(完全一致または /MODEfind . -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連携)

ディスク容量アラートが発生した際、どのファイルが容量を圧迫しているかを素早く特定するコマンドです。dusort を連携させ、容量の大きい順にトップ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)

ファイル名にスペース(空白)、改行、日本語などが含まれている場合、通常のパイプ渡しでは意図せずファイル名が途中で分割されて事故につながります。-print0xargs -0 をセットで使うことで、ヌル文字()区切りで安全にコマンドへ渡せます。

# 空白や特殊文字を含むCSVファイルを安全に一括圧縮
find /data/exports -type f -name "*.csv" -print0 | xargs -0 gzip

3.6 特定のディレクトリ(.git や node_modules)を除外して検索する(-prune)

大規模リポジトリやプロジェクト配下で、検索不要な巨大ディレクトリ(node_modules.git, vendor)を探索対象からスキップして検索を高速化します。

# node_modules と .git ディレクトリを除外して .js ファイルを検索
find . ( -path "./node_modules" -o -path "./.git" ) -prune -o -type f -name "*.js" -print

3.7 直近24時間以内(または60分以内)に更新されたファイルを調査する

「直近のデプロイや設定変更で書き換わったファイルを特定したい」というトラブルシューティング時に重宝する検索方法です。

# 直近24時間以内(-1日)に更新された設定ファイル
find /etc -type f -name "*.conf" -mtime -1

# 直近60分以内(-60分)に作成・更新されたファイルを検索
find /tmp -type f -mmin -60

3.8 ディレクトリ階層の深さを1階層(直下のみ)に限定する(-maxdepth 1)

サブディレクトリ以下を再帰探索せず、指定したディレクトリの直下にあるファイルだけを検索対象とします。

# カレントディレクトリ直下の .conf ファイルのみ検索(サブディレクトリは探索しない)
find . -maxdepth 1 -type f -name "*.conf"

3.9 空のファイル・空ディレクトリを洗い出して整理する(-empty)

不要になった0バイトの空ファイルや空ディレクトリを検出・削除します。

# 0バイトの空ファイルを検索
find /tmp -type f -empty

# 空ディレクトリのみを検索して一括削除
find /tmp -type d -empty -delete

3.10 特定ユーザー・グループが所有するファイルのみ抽出する(-user / -group)

Webサーバーのドキュメントルートで、Web実行ユーザー(例: www-datanginx)以外の権限になってしまっているファイルを洗い出します。

# 所有者が www-data でないファイルを検出
find /var/www/html -type f ! -user www-data

3.11 特定の日付・特定ファイルより新しいファイルを検索する(-newer / -newermt)

特定の日時(タイムスタンプ)以降に更新されたファイルをピンポイントで検索します(GNU find対応)。

# 2026年8月1日以降に更新されたファイルを検索
find /var/log -type f -newermt "2026-08-01 00:00:00"

# reference.txt より後に更新されたファイルを検索
find . -type f -newer reference.txt

3.12 実行権限のあるスクリプトファイルのみ抽出する(-executable)

パーミッションの実行ビットが立っており、現在のユーザーが実行可能なファイルを検索します。

# ./scripts ディレクトリ内の実行可能ファイルを一覧表示
find ./scripts -type f -executable

3.13 リンク切れのシンボリックリンクを検出する(-xtype l)

参照先の元ファイルが削除されて参照不能になっている壊れたシンボリックリンク(孤立リンク)を検出します。

# リンク切れしているシンボリックリンクを検出
find . -xtype l

3.14 検索結果のファイル内容を grep で一括文字列検索する

「特定のディレクトリ配下にある .conf ファイルの中から、指定のキーワードを含む行を探したい」という場合に grep と連携します。

# 設定ファイル内から "Listen" を含む行を行番号・ファイル名付きで検索
find /etc/nginx -type f -name "*.conf" -exec grep -Hn "Listen" {} +

3.15 ディレクトリには755、ファイルには644を一括適用する(chmod連携)

Webサーバー移行やアーカイブ解凍後、ファイルとディレクトリで適切な権限を一括設定するWeb制作・インフラの定番テクニックです。

# ディレクトリのみ 755 に一括変更
find /var/www/html -type d -exec chmod 755 {} +

# ファイルのみ 644 に一括変更
find /var/www/html -type f -exec chmod 644 {} +

3.16 条件に一致しないファイルを除外して検索する(! / -not)

バックアップファイル(.bak.tmp)以外の通常ファイルだけを対象に処理したい場合の否定条件です。

# .bak および .tmp 以外のファイルを検索
find . -type f ! -name "*.bak" ! -name "*.tmp"

3.17 検索結果のファイル数(件数)をカウントする(wc -l 連携)

膨大なログファイルや画像ファイルの総件数を素早く調査したい場合にパイプで wc -l へ渡します。

# 圧縮済みログファイル(.gz)の総数をカウント
find /var/log -type f -name "*.gz" | wc -l

3.18 検索結果を別ディレクトリへ一括コピー・移動する(-exec cp/mv 連携)

7日以上前のアーカイブファイルを別ディレクトリへ退避・移動するパターンです。-t オプションで移動先ディレクトリを指定すると安全です。

# 7日以上前のPDFファイルを /data/archive/ へ一括移動
find /data/incoming -type f -name "*.pdf" -mtime +7 -exec mv -t /data/archive/ {} +

4. よくあるエラー・落とし穴と安全対策

find コマンドは強力な半面、条件指定のミスやシェルの仕様理解不足によって予期せぬ誤削除やパフォーマンス低下を引き起こすことがあります。実務で必ず押さえておくべき4つの安全対策を整理しました。

4.1 ワイルドカード(*)のダブルクォート囲み忘れ

find . -name *.log のようにクォートなしで実行すると、カレントディレクトリに a.logb.log が存在する場合、シェルが先に find . -name a.log b.log と展開してしまいます。その結果、find: paths must precede expression という構文エラーが発生するか、先頭の1ファイルしか検索されません。

# NG(シェル展開されてエラーや予期せぬ動作の原因に)
find . -name *.log

# OK(必ずクォートで囲んで find 自身にパターンを渡す)
find . -name "*.log"

4.2 -exec CMD {} ; と -exec CMD {} + のパフォーマンス差

-exec の末尾には ;+ の2通りの書き方があります。この2つには重大な処理速度の違いがあります。

  • -exec CMD {} ;: 検索にマッチしたファイル1件につき、コマンドを1回起動します。ファイルが10,000件あれば10,000回プロセスがフォークされるため、極めて低速になります。
  • -exec CMD {} +: マッチしたファイルをまとめて引数に並べ、最小限のプロセス回数で実行します(xargs と同様の挙動)。
# 低速(1ファイルごとに rm プロセスを起動)
find . -type f -name "*.tmp" -exec rm {} ;

# 高速・推奨(まとめて rm に渡して一括削除)
find . -type f -name "*.tmp" -exec rm {} +

4.3 誤削除を防ぐための事前確認(ドライラン手順)

-delete-exec rm を使った削除処理を行う際は、必ず削除コマンドを省いて一覧表示(-ls-print)でテスト実行するのがプロの現場の絶対ルールです。

# 1. まず一覧表示して対象ファイルが正しいか確認
find /var/log/app -type f -mtime +60 -ls

# 2. 意図通りの一覧であることを目視確認した上で削除を実行
find /var/log/app -type f -mtime +60 -delete

4.4 Permission denied の標準エラー出力を抑制する

システム全体(/)や他のユーザーディレクトリを検索すると、権限のないディレクトリに対して「Permission denied」が画面を埋め尽くしてしまいます。標準エラー出力を 2>/dev/null で捨てることで、見つかった結果だけをクリーンに確認できます。

# エラー出力を破棄してマッチした結果のみ表示
find / -name "nginx.conf" 2>/dev/null

5. まとめ & 関連記事

find コマンドは、Linuxサーバーのファイル管理・容量調査・定期メンテナンスにおいて最も基本かつ強力なツールです。最後に要点を振り返りましょう。

  • 条件の組み合わせ: -name, -mtime, -size, -type を柔軟に組み合わせて目的のファイルをピンポイントに絞り込む。
  • 一括処理の最適化: 複数ファイルへのコマンド適用はプロセス負荷の低い -exec CMD {} +find -print0 | xargs -0 を標準として活用する。
  • 安全な実行手順: ワイルドカードのクォート囲み("*.log")を徹底し、削除前には必ず -ls で目視確認する。

関連コマンド記事(あわせて読みたい)

Bash玄

はじめまして!Bash玄です。

エンジニアとしてシステム運用に携わる中で、手作業の多さに限界を感じ、Bashスクリプトを活用して業務を効率化したのがきっかけで、この道に入りました。「手作業は負け」「スクリプトはシンプルに」をモットーに、誰でも実践できるBashスクリプトの書き方を発信しています。

このサイトでは、Bashの基礎から実践的なスクリプト作成まで、初心者でもわかりやすく解説しています。少しでも「Bashって便利だな」と思ってもらえたら嬉しいです!

# 好きなこと
- シンプルなコードを書くこと
- コマンドラインを快適にカスタマイズすること
- 自動化で時間を生み出すこと

# このサイトを読んでほしい人
- Bashに興味があるけど、何から始めればいいかわからない人
- 定型業務を自動化したい人
- 効率よくターミナルを使いこなしたい人

Bashの世界に一歩踏み出して、一緒に「Bash道」を極めていきましょう!

Bash玄をフォローする

コメント