萬盛學電腦網

您现在的位置: 萬盛學電腦網 >> 作業系統 >  >> Linux 教學

Linux 利用 find + crontab 實現日誌定期遷移備份

伺服器運行久了,日誌檔案會佔據大量磁碟空間。透過 find 的 -mtime 參數搭配 -exec 或管線 mv,再配合 crontab 定時執行,即可建立自動化的日誌遷移機制。本文將從 find 核心參數講起,逐步建立一支可生產環境使用的遷移腳本。

find 核心參數速查

參數說明
-type f僅尋找一般檔案
-mtime +n修改時間超過 n 天前(不含第 n 天)
-mtime -n修改時間在 n 天內
-exec cmd {} \;對每個結果執行 cmd,{} 為檔名佔位符
-print0以 null 字元分隔輸出,配合 xargs -0 處理特殊檔名

遷移腳本範例(每兩週執行一次)

#!/bin/bash
# 設定區
backup_dir="/backup/log"
keep_days=14
week_num=$(date +%W)
flag=$((week_num % 2))          # 奇數週執行

# 要遷移的來源目錄陣列
migrate_dirs=("/var/log/nginx/test1")

# 主邏輯
if [ $flag -eq 1 ]; then
  for dir in "${migrate_dirs[@]}"; do
    [ -d "$dir" ] || continue
    # 建立對應備份目錄
    dest="${backup_dir}${dir}"
    [ -d "$dest" ] || mkdir -p "$dest"
    # 找出超過保留天數的檔案並移動
    find "$dir" -type f -mtime +$keep_days -print0 |
      xargs -0 -I {} mv {} "$dest"
  done
fi

說明: 使用 -print0 | xargs -0 可安全處理含空格、換行的檔名;mv 同檔案系統內為原子重命名,極快。

crontab 排程設定

# 每兩週的週日 04:00 執行(第 0,2,4... 週)
0 4 * * 0/2 /home/wangzhengyi/scripts/clean-scripts/migrate.sh

或用 7/2 表示每兩週的週日(視 cron 實作而定),建議先用 crontab -l 確認語法。

延伸:依檔案大小清理

find 亦支援 -size 參數:

  • +10k:大於 10KB
  • -100M:小於 100MB
  • 單位:c(byte), k(KiB), M(MiB), G(GiB)
# 刪除 /var/log 下超過 100MB 的舊日誌
find /var/log -type f -size +100M -mtime +30 -delete

find size 參數對照表

find 大於 10k 範例

copyright © 萬盛學電腦網 all rights reserved