Linuxで更新日が一定期間を経過した古いファイルを一括削除する

linux-find-mtime-deleteテクノロジー

例えば、Linuxでログやバックアップを毎日取得し続け、ある程度日数が経過して不要になったファイル削除したい場合、毎日手動でするのは手間がかかります。
そこで、一定期間以上経過した古いファイル一括自動的削除する方法をご紹介します!

n日経過したファイルを削除

例として、最終更新日が3日以上経過したログファイル(.log)を一括削除したいと思います。
今回使用するLinuxコマンドはたった1つ。findのみです!
まずは、findコマンドを使用して、特定のディレクトリからn日経過したファイルを検索します。

findでファイルを検索

findの基本的な使い方はこちら。
検索対象のディレクトリパスとファイル名を指定します。

# find [ディレクトリパス] -name '[ファイル名]' <オプション>...

ファイル名にワイルドカードを使用して、特定のディレクトリパスに存在する拡張子が[.log]のファイルを検索します。

# find /path/to/ -name '*.log'

n日経過を指定するオプション

n日経過は[-mtime]オプションで指定します。
今回の例では3日なので[+3]としていますが、符号が[+]か[-]、または無しでは意味が異なりますので注意してください。

# find /path/to/ -name '*.log' -mtime +3

こちらのタイムスタンプに関するオプションは、最終更新日だけでなく、最終アクセス日やファイルの作成日、それから日指定だけでなく分指定することもできます。

オプション概要
-mminファイルのデータが最後に修正された日時(分指定)
-mtimeファイルのデータが最後に修正された日時(日指定)
-aminファイルのデータに最後にアクセスされた日時(分指定)
-atimeファイルのデータに最後にアクセスされた日時(日指定)
-cminファイルのデータとステータスが最後に修正された日時(分指定)
-ctimeファイルのデータとステータスが最後に修正された日時(日指定)
引用:findコマンドのmtimeオプションまとめ – Qiita

ファイルを削除するオプション

findコマンドで検索したファイルを削除する場合は、[-delete]オプションを使用します。
それでは、最終的に完成したコマンドがこちらになります!

# find /path/to/ -name '*.log' -mtime +3 -delete

巷では、パイプ(|)してxargsやrmと併用している情報が多いですが、findオプションだけで実現する方がとてもスマートです。
後は上記のコマンドcronで定期的に実行してしまえば、自動的に古いファイルを一括削除してくれるという訳です。

【おまけ】0時を起点にする

上記のコマンドでは、実行した時点から3日(72時間)以上のファイル削除しますが、コマンドを実行した時間に関係なく、必ず0時を起点としてn日前を指定したい場合は、[-daystart]オプションを利用します。

# find /path/to/ -name '*.log' -daystart -mtime +3 -delete

これで、シェル等の処理時間に差があったとしても、同じ条件で一括削除することができますね!
お疲れ様でした!

東京生まれ福岡育ちの文系プログラマー。
テクノロジーの恩恵を感じながら日々精進しています。
広く浅くをモットーに、最近ではプログラミングだけでなく、仮想サーバーからセキュリティ、監視システムなども勉強中です。

管理者をフォローする

コメント

タイトルとURLをコピーしました