我有一個腳本,刪除數據庫轉儲是不是說X = 21從備份目錄天以上:刪除超過X天的所有文件,但至少保持在Y最小
DB_DUMP_DIR=/var/backups/dbs
RETENTION=$((21*24*60)) # 3 weeks
find ${DB_DUMP_DIR} -type f -mmin +${RETENTION} -delete
但如果無論出於何種原因,數據庫轉儲作業都無法完成一段時間,所有轉儲最終都會被丟棄。所以作爲一個保障,我想保留至少最年輕的Y = 7次轉儲,即使它全部或部分大於21天。
我尋找的東西是比這麪條更優雅。
DB_DUMP_DIR=/var/backups/dbs
RETENTION=$((21*24*60)) # 3 weeks
KEEP=7
find ${DB_DUMP_DIR} -type f -printf '%[email protected] %p\n' | \ # list all dumps with epoch
sort -n | \ # sort by epoch, oldest 1st
head --lines=-${KEEP} |\ # Remove youngest/bottom 7 dumps
while read date filename ; do # loop through the rest
find $filename -mmin +${RETENTION} -delete # delete if older than 21 days
done
(此片段可能有小錯誤 - 忽略他們這是爲了說明我能想出自己,爲什麼我不t喜歡它)
編輯:查找選項「-mtime」是一次性的:「-mtime +21」實際上意味着「至少22天大」。這總讓我困惑,所以我使用-mmin代替。還有一次,但只有一分鐘。
感謝'date -d「21天前」+%s「,我不知道。所以在我的示例腳本中,我可以將while循環塊更改爲: [「$ {date%\。[0-9] *}」-lt「$ {t21}」] && echo rm $ {filename} –
是。但是使用bash的[[]]'意味着你需要更少的引用:'[[$ {date%。*} -lt $ t21]]''。另外dot不是一個特殊的glob字符,所以你不必轉義它:'$ {date%\。[0-9] *}'意味着「刪除一個點後跟一個數字,後面跟零個或多個任意字符」。如果你想刪除嚴格的數字,你需要'shopt -s extglob'然後''{date%。*([0-9])}' - 見http://www.gnu.org/software/ bash/manual/bashref.html#模式匹配 –