Windows XP Windows 7 Windows 2003 Windows Vista Windows 綜合教學 Linux 系統教學
Windows 10 Windows 8 Windows 2008 Windows NT Windows Server 電腦軟體教學
您现在的位置: Windows教程網 >> Windows教程 >  >> Linux 系統教學 >> Linux 教學

Linux 批量刪除多文件實戰:find + xargs 自動化備份清理腳本

編輯:Linux 教學

生產環境備份文件隨時間增長,需定期清理舊備份並保留關鍵節點(如每月 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"

cron 定時任務部署


# 編輯 root crontab
crontab -e

# 每天凌晨 2:30 執行清理
30 2 * * * /usr/local/sbin/backup_cleanup.sh

避坑指南

  • find -print0 | xargs -0:處理文件名含空格/特殊字符,防止注入
  • 先測試:去掉 xargs rm 先用 find ... -ls 預覽
  • 權限:腳本需對備份目錄有 w+x 權限
  • 磁盤空間:df -h 監控,防止日誌本身佔滿磁盤
  • 並發安全:多實例時加鎖(flock)防止重複執行

總結

find 精準匹配,xargs 高效批量,date 動態計算日期,cron 定時自動化。這套組合拳讓備份清理「設定一次,長期無憂」。

Copyright © Windows教程網 All Rights Reserved