3世代残したい場合は、下記のスクリプトワンライナーでいけます。
(考え方としては、3世代残す→ファイル全部から残したい3世代以外のものを消すと読み替える)
(時間的に古いものから消す場合)
ls -1rt | head -n -3 | xargs rm -rf
(ログの文字列たとえばtestlog20200701等の日付の古いものから消す場合)
ls -1 | head -n -3 | xargs rm -rf
説明(ログの文字列から判断して古いものを消す場合)
1.ダミーのログを配置
touch testlog2020070{1..9}
2.確認
ls -la
-rw-r--r--. 1 root root 0 5月 17 16:40 testlog20200701
-rw-r--r--. 1 root root 0 5月 17 16:40 testlog20200702
-rw-r--r--. 1 root root 0 5月 17 16:40 testlog20200703
-rw-r--r--. 1 root root 0 5月 17 16:40 testlog20200704
-rw-r--r--. 1 root root 0 5月 17 16:40 testlog20200705
-rw-r--r--. 1 root root 0 5月 17 16:40 testlog20200706
-rw-r--r--. 1 root root 0 5月 17 16:40 testlog20200707
-rw-r--r--. 1 root root 0 5月 17 16:40 testlog20200708
-rw-r--r--. 1 root root 0 5月 17 16:40 testlog20200709
3.削除対象の抽出
20200707から20200709を残したい→(testlog20200701から20200706を削除したいと読み替える)
ls -1 | head -n -3
testlog20200701
testlog20200702
testlog20200703
testlog20200704
testlog20200705
testlog20200706
4.抽出したログを削除
ls -1 | head -n -3 | xargs rm -rf
確認
ls -la
testlog20200707
testlog20200708
testlog20200709
目的の3世代を残せました。
※)(時間的に古いものから消す場合)については、ls -1rtにて行うことで実現している。
オプションt 時間順番で並び替える
オプションr 逆に並べ替える
ログのローテートそのものは、Linux標準のlogrotate.dを使用して行い、削除部分のみをシェルスクリプトにて行うことを想定しています。
(logrotate.dの削除スクリプトはx日前という形で処理してあり、削除スクリプトがなんらかの理由で動かなかった場合にログが残ってしまう場合があるため)