伺服器運行久了,日誌檔案會佔據大量磁碟空間。透過 find 的 -mtime 參數搭配 -exec 或管線 mv,再配合 crontab 定時執行,即可建立自動化的日誌遷移機制。本文將從 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 同檔案系統內為原子重命名,極快。
# 每兩週的週日 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:小於 100MBc(byte), k(KiB), M(MiB), G(GiB)# 刪除 /var/log 下超過 100MB 的舊日誌
find /var/log -type f -size +100M -mtime +30 -delete

