生產環境備份文件隨時間增長,需定期清理舊備份並保留關鍵節點(如每月 1 號)。本文提供成熟的 Shell 腳本,結合 find 模式匹配與 xargs 批量刪除,實現靈活的備份留存策略。
#!/bin/bash
# 備份目錄
BAK_DIR="/home/bak/web"
# 打包當前備份(示例)
tar -zcvf "$BAK_DIR/web_mantis_$(date +%Y%m%d).tar.gz" /usr/local/apache2/htdocs/mantis
# 計算 7 天前日期
DAY_DELETE=$(date -d '-7 day' +%Y%m%d)
DAY_NUM=$(date -d '-7 day' +%d)
# 保留每月 1 號備份,刪除 7 天前其他備份
if [ "$DAY_NUM" != "01" ]; then
# 精確匹配文件名模式並刪除
find "$BAK_DIR" -name "web_*_${DAY_DELETE}.tar.gz" | xargs rm -f >> webdelete.log
echo "[$(date)] 刪除 7 天前備份成功: web_*_${DAY_DELETE}.tar.gz" >> webdelete.log
fi
| 技術 | 用法 | 說明 |
|---|---|---|
date -d '-7 day' | 日期運算 | GNU date 相對時間計算,跨月自動處理 |
find -name "pattern" | 文件名模式匹配 | 支持通配符 * ? [] |
xargs rm -f | 批量刪除 | 將 find 輸出作為 rm 參數,避免參數過長錯誤 |
>> log | 追加日誌 | 記錄操作時間與結果,便於審計 |
#!/bin/bash
BAK_DIR="/backup"
LOG_FILE="/var/log/backup_cleanup.log"
# 策略:保留最近 7 天 + 每月 1 號 + 每周日
RETENTION_DAYS=7
cleanup() {
local pattern="$1"
local days="$2"
local keep_pattern="$3"
find "$BAK_DIR" -name "$pattern" -mtime +$days \
! -name "$keep_pattern" -print0 | xargs -0 rm -f
}
# 執行清理
cleanup "db_*.sql.gz" 7 "db_*-01-*.sql.gz" # 保留每月 1 號
cleanup "web_*.tar.gz" 7 "web_*-01-*.tar.gz" # 保留每月 1 號
cleanup "log_*.tgz" 30 "" # 日誌保留 30 天,無特殊保留
echo "[$(date)] Backup cleanup completed" >> "$LOG_FILE"
# 編輯 root crontab
crontab -e
# 每天凌晨 2:30 執行清理
30 2 * * * /usr/local/sbin/backup_cleanup.sh
xargs rm 先用 find ... -ls 預覽w+x 權限df -h 監控,防止日誌本身佔滿磁盤flock)防止重複執行find 精準匹配,xargs 高效批量,date 動態計算日期,cron 定時自動化。這套組合拳讓備份清理「設定一次,長期無憂」。