初めに
よく7日前のログファイルを消してローテーションのように日付が条件として使われますが、
今回は個数指定でローテーションする場合のbashサンプルを作ってみました。
ローテーション対象ファイル
今回ローテーションするファイルは
server.log.YYYY-MM-DDの形式でローテーションすることとします。
/var/log/server.log # 最新のファイル
/var/log/server.log.2020-03-25
/var/log/server.log.2020-03-24
/var/log/server.log.2020-03-23
/var/log/server.log.2020-03-22
実装
#!/bin/bash
ROTATE_GEN=7 # ローテーション世代(今回は7個残す)
LOG=/var/log/server.log # 対象ファイル
# 日付付きでファイルを退避
mv ${LOG} ${LOG}.`date +"%Y-%m-%d"`
# 現在のファイル数(FILE_CNT) - 世代数(ROTATE_GEN)
# = 削除するファイル数(RM_CNT)
FILE_CNT=`ls -1t ${LOG}.* | wc -l`
RM_CNT=`expr ${FILE_CNT} - ${ROTATE_GEN}`
# RM_CNTの数だけファイルを削除
if [[ $RM_CNT -gt 0 ]] ; then
ls -1t ${LOG}.* | tail -n ${RM_CNT} | xargs rm -f
fi
補足
* lsのオプションは'l(エル)'ではなく'1(イチ)'