この内容は古いバージョンです。最新バージョンを表示するには、戻るボタンを押してください。
バージョン:3
ページ更新者:T
更新日時:2026-09-06 15:08:53

タイトル: 特定フォルダ以下の特定拡張子のファイルを再帰的に削除する方法
SEOタイトル: Linuxで特定拡張子のファイルを再帰削除|find -deleteの安全手順

この記事の要点
  • find ディレクトリ -type f -name "*.拡張子" -delete がもっとも安全で速い
  • 実行前に必ず find ... -print だけで対象を確認してから削除する(dry-run)
  • -exec rm {} + や xargs rm でも可。ファイル名にスペース・改行がある場合は -print0 + xargs -0
  • 対象外にしたいディレクトリは -not -path や -prune で除外
  • 本番サーバでは絶対パス指定とバックアップを徹底し、削除前に一覧をログに残す

やりたいこと

指定したフォルダ以下のサブディレクトリも含めて、特定の拡張子のファイル(例: *.tmp / *.log / *.bak)を再帰的に削除したい、というニーズです。Linux/macOS では find コマンドが最も適しています。

もっとも安全で速い書き方

# /path/to/folder 以下の *.txt をすべて削除
find /path/to/folder -type f -name "*.txt" -delete

-delete は find 自身が削除する組み込みアクションで、サブプロセスを起動しない分高速で安全です。GNU find / BSD find(macOS)どちらでも使えます。

削除前に必ず dry-run

# まずは対象一覧を出力して目視確認
find /path/to/folder -type f -name "*.txt" -print

# 件数だけ知りたい
find /path/to/folder -type f -name "*.txt" | wc -l

削除コマンドは取り消せません。必ず -print で対象を確認してから -delete に切り替えるのが鉄則です。

-exec rm を使う書き方

# 各ファイルに対して rm を実行(+ でまとめて引数化、効率良い)
find /path/to/folder -type f -name "*.txt" -exec rm {} +

# 古い書き方(1 ファイルごとに rm を起動するため遅い)
find /path/to/folder -type f -name "*.txt" -exec rm {} \;
記法挙動
-exec rm {} +マッチをまとめて 1 回の rm に渡す(高速)
-exec rm {} \;1 ファイルごとに rm を起動(遅い、互換用)

xargs を使う書き方

# 通常版
find /path/to/folder -type f -name "*.txt" | xargs rm

# 改行・スペース込みのファイル名にも安全な版
find /path/to/folder -type f -name "*.txt" -print0 | xargs -0 rm

ファイル名に空白・改行・記号が混じる可能性があるなら、-print0 + xargs -0 ペアが必須です。

除外したいディレクトリがある場合

# node_modules と .git は除外
find /path/to/folder \
  -not -path "*/node_modules/*" \
  -not -path "*/.git/*" \
  -type f -name "*.log" -delete

# -prune の方がパフォーマンス良い
find /path/to/folder \
  \( -name node_modules -o -name .git \) -prune \
  -o -type f -name "*.log" -print -delete

削除前に一覧をログ保存

# 削除対象をログに残してから削除
TS=$(date +%Y%m%d_%H%M%S)
find /path/to/folder -type f -name "*.tmp" -print > "/tmp/deleted_${TS}.txt"
find /path/to/folder -type f -name "*.tmp" -delete

echo "deleted $(wc -l < /tmp/deleted_${TS}.txt) files."

更新日時で絞り込む

# 30 日以上前に更新された *.log だけ削除
find /var/log/myapp -type f -name "*.log" -mtime +30 -delete

# 7 日以内のものを残す
find /tmp -type f -mtime +7 -delete

よくある事故とその防止

事故原因 / 防止策
意図しないファイルを大量削除パスの相対指定 / typo / シェル展開ミス。絶対パスで書き、-print で確認
rm * のグロブ展開でディレクトリ巻き込み-type f でファイルに限定
シンボリックリンクの先まで消えるfind はデフォルトで follow しない。-L 付与時は要注意
差し戻せない大事な階層では rm ではなく mv でゴミ箱ディレクトリへ移動する運用
Windows との混在環境WSL や Git Bash でも同じコマンドが動く。改行コードに注意

本番運用のチェックリスト

  • パスは絶対パスで書く
  • 削除コマンドの前に必ず -print で目視確認
  • 件数を wc -l で確認し、想定範囲か検証
  • 削除前に一覧をログファイルに保存
  • 大事なディレクトリは rm ではなく mv で退避
  • cron 化する前に何度か手で実行してパターンを固める

容量を超えたファイルだけ削除

# 100MB 超のログファイルだけ削除
find /var/log -type f -name "*.log" -size +100M -delete

# 1MB 未満で 30 日以上古い一時ファイル
find /tmp -type f -size -1M -mtime +30 -delete

空フォルダの削除

# 削除後に空になったディレクトリを片付ける
find /path/to/folder -type d -empty -delete

cron で定期実行する

# /etc/cron.d/clean-tmp
# 毎日 03:00 に /tmp の 7 日以上前のファイルを削除
0 3 * * * root find /tmp -type f -mtime +7 -delete >> /var/log/clean-tmp.log 2>&1

関連

  • コマンド一覧 — 親カテゴリ
  • find — ファイル検索コマンド
  • xargs — 標準入力を引数に展開
  • rm / unlink — ファイル削除
  • logrotate — ログの自動削除・ローテーション

📚 関連: ファイル形式・拡張子セクション — 主要なファイル拡張子・形式を体系的に解説。ファイル拡張子とは(概論)