lycheejam's tech log

チラ裏のメモ帳 | プログラミングは苦手、インフラが得意なつもり。

N日より前のファイルを削除するコマンド

概要

N日より前の特定のファイルを削除したいってシュチュエーションで使うコマンドです。
具体的には以下のシチュエーションです。

  • logrotateが使えない
  • ファイルはログファイル
  • 出力元アプリがapplication.log-YYYYMMDDの様な形式で、YYYYMMDDの日付suffixが付く

アプリが自動でログローテートしてるのでサーバ側でlogrotateの設定は入れれません。
が、当該ログファイルの削除処理はどこにもないのでたまり続けます。といった具合。

コマンド

find /var/www/app/logs -name "application.log-*" -mtime +7 -exec rm -f {}\;

詳細

find -mtime

-mtimeで「最終更新日が7日以前のファイル」と指定する。
詳細は以下を参照のこと。

find(1) - Linux manual page

mtimeの時間範囲の計算がいまいち分かりづらかったので整理。
コマンド実行時点を0日目として、24時間前を1日目...Nという風に考える。
時間の端数は無視されるとのことなので、実行時点から24時間未満(1未満)は無視される。なので24時間前が1日前と言うカウント。
詳細は以下。

File was last accessed less than, more than or exactly n*24 hours ago. When find figures out how many 24-hour periods ago the file was last accessed, any fractional part is ignored, so to match -atime +1, a file has to have been accessed at least two days ago.

find(1) - Linux manual page

ローカルでの実験が以下の通り。当日分1世代+前日からの7世代を保持って感じになる。

実験ログ

$ date
20221010日 月曜日 230148秒 JST
$ ls -l
total 0
-rw-r--r--  1 z  staff  0  9 27 21:00 application.log-20220927
-rw-r--r--  1 z  staff  0  9 28 21:00 application.log-20220928
-rw-r--r--  1 z  staff  0  9 29 21:00 application.log-20220929
-rw-r--r--  1 z  staff  0  9 30 21:00 application.log-20220930
-rw-r--r--  1 z  staff  0 10  1 21:00 application.log-20221001
-rw-r--r--  1 z  staff  0 10  2 21:00 application.log-20221002
-rw-r--r--  1 z  staff  0 10  3 21:00 application.log-20221003
-rw-r--r--  1 z  staff  0 10  4 21:00 application.log-20221004
-rw-r--r--  1 z  staff  0 10  5 21:00 application.log-20221005
-rw-r--r--  1 z  staff  0 10  6 21:00 application.log-20221006
-rw-r--r--  1 z  staff  0 10  7 21:00 application.log-20221007
-rw-r--r--  1 z  staff  0 10  8 21:00 application.log-20221008
-rw-r--r--  1 z  staff  0 10  9 21:00 application.log-20221009
-rw-r--r--  1 z  staff  0 10 10 21:00 application.log-20221010
$ find . -mtime +0 | sort
./application.log-20220927
./application.log-20220928
./application.log-20220929
./application.log-20220930
./application.log-20221001
./application.log-20221002
./application.log-20221003
./application.log-20221004
./application.log-20221005
./application.log-20221006
./application.log-20221007
./application.log-20221008
./application.log-20221009
$ find . -mtime +1 | sort
./application.log-20220927
./application.log-20220928
./application.log-20220929
./application.log-20220930
./application.log-20221001
./application.log-20221002
./application.log-20221003
./application.log-20221004
./application.log-20221005
./application.log-20221006
./application.log-20221007
./application.log-20221008
$ find . -mtime +2 | sort
./application.log-20220927
./application.log-20220928
./application.log-20220929
./application.log-20220930
./application.log-20221001
./application.log-20221002
./application.log-20221003
./application.log-20221004
./application.log-20221005
./application.log-20221006
./application.log-20221007
$ find . -mtime +3 | sort
./application.log-20220927
./application.log-20220928
./application.log-20220929
./application.log-20220930
./application.log-20221001
./application.log-20221002
./application.log-20221003
./application.log-20221004
./application.log-20221005
./application.log-20221006
$ find . -mtime +4 | sort
./application.log-20220927
./application.log-20220928
./application.log-20220929
./application.log-20220930
./application.log-20221001
./application.log-20221002
./application.log-20221003
./application.log-20221004
./application.log-20221005
$ find . -mtime +5 | sort
./application.log-20220927
./application.log-20220928
./application.log-20220929
./application.log-20220930
./application.log-20221001
./application.log-20221002
./application.log-20221003
./application.log-20221004
$ find . -mtime +6 | sort
./application.log-20220927
./application.log-20220928
./application.log-20220929
./application.log-20220930
./application.log-20221001
./application.log-20221002
./application.log-20221003
$ find . -mtime +7 | sort
./application.log-20220927
./application.log-20220928
./application.log-20220929
./application.log-20220930
./application.log-20221001
./application.log-20221002
$ find . -mtime +8 | sort
./application.log-20220927
./application.log-20220928
./application.log-20220929
./application.log-20220930
./application.log-20221001
$ find . -mtime +9 | sort
./application.log-20220927
./application.log-20220928
./application.log-20220929
./application.log-20220930

以下のサイトが大変参考になりました。

【Linux】find コマンド【図解】 | 100%レンタルサーバーを使いこなすサイト

find -exec

-execで実行するコマンドを指定しているが、最後のエスケープとセミコロン(\;)が肝。
execで渡したコマンドの終端を示す。

参考:find -exec の後ろにつく\; と + の違い | 雑廉堂の雑記帳

以上。