タイトル: 特定フォルダ以下の特定拡張子のファイルを再帰的に削除する方法
SEOタイトル: Linuxで特定拡張子のファイルを再帰削除|find -deleteの安全手順
| この記事の要点 |
|
やりたいこと
指定したフォルダ以下のサブディレクトリも含めて、特定の拡張子のファイル(例: *.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 — ログの自動削除・ローテーション
📚 関連: ファイル形式・拡張子セクション — 主要なファイル拡張子・形式を体系的に解説。ファイル拡張子とは(概論)