例えば、Linuxでログやバックアップを毎日取得し続け、ある程度日数が経過して不要になったファイルを削除したい場合、毎日手動でするのは手間がかかります。
そこで、一定期間以上経過した古いファイルを一括で自動的に削除する方法をご紹介します!
n日経過したファイルを削除
例として、最終更新日が3日以上経過したログファイル(.log)を一括削除したいと思います。
今回使用するLinuxのコマンドはたった1つ。findのみです!
まずは、findコマンドを使用して、特定のディレクトリからn日経過したファイルを検索します。
findでファイルを検索
findの基本的な使い方はこちら。
検索対象のディレクトリパスとファイル名を指定します。
1 |
# find [ディレクトリパス] -name '[ファイル名]' <オプション>... |
ファイル名にワイルドカードを使用して、特定のディレクトリパスに存在する拡張子が[.log]のファイルを検索します。
1 |
# find /path/to/ -name '*.log' |
n日経過を指定するオプション
n日経過は[-mtime]オプションで指定します。
今回の例では3日なので[+3]としていますが、符号が[+]か[-]、または無しでは意味が異なりますので注意してください。
1 |
# find /path/to/ -name '*.log' -mtime +3 |
こちらのタイムスタンプに関するオプションは、最終更新日だけでなく、最終アクセス日やファイルの作成日、それから日指定だけでなく分指定することもできます。
オプション | 概要 |
---|---|
-mmin | ファイルのデータが最後に修正された日時(分指定) |
-mtime | ファイルのデータが最後に修正された日時(日指定) |
-amin | ファイルのデータに最後にアクセスされた日時(分指定) |
-atime | ファイルのデータに最後にアクセスされた日時(日指定) |
-cmin | ファイルのデータとステータスが最後に修正された日時(分指定) |
-ctime | ファイルのデータとステータスが最後に修正された日時(日指定) |
ファイルを削除するオプション
findコマンドで検索したファイルを削除する場合は、[-delete]オプションを使用します。
それでは、最終的に完成したコマンドがこちらになります!
1 |
# find /path/to/ -name '*.log' -mtime +3 -delete |
巷では、パイプ(|)してxargsやrmと併用している情報が多いですが、findのオプションだけで実現する方がとてもスマートです。
後は上記のコマンドをcronで定期的に実行してしまえば、自動的に古いファイルを一括削除してくれるという訳です。
【おまけ】0時を起点にする
上記のコマンドでは、実行した時点から3日(72時間)以上のファイルを削除しますが、コマンドを実行した時間に関係なく、必ず0時を起点としてn日前を指定したい場合は、[-daystart]オプションを利用します。
1 |
# find /path/to/ -name '*.log' -daystart -mtime +3 -delete |
これで、シェル等の処理時間に差があったとしても、同じ条件で一括削除することができますね!
お疲れ様でした!
コメント