伺服器長期運行會產生大量日誌、暫存、備份檔案,透過 find 指令搭配 crontab 定時清理超過指定天數的檔案,能有效避免磁碟爆滿導致服務中斷。本文提供標準化清理腳本與排程設定。
核心指令解析
find /var/www/ -type f -mtime +30 -exec rm -f '{}' \;
| 參數 | 說明 |
| /var/www/ | 搜尋起始路徑(遞迴子目錄) |
| -type f | 僅匹配一般檔案(排除目錄、連結、裝置檔) |
| -mtime +30 | 修改時間超過 30 天(30*24小時前) |
| -exec rm -f '{}' \; | 對每個匹配檔案執行強制刪除,{} 為檔案路徑佔位符 |
時間參數對照
| 參數 | 含義 | 範例 |
| -mtime +n | 修改時間超過 n 天前 | -mtime +7 (一週前) |
| -mtime -n | 修改時間在 n 天內 | -mtime -1 (24小時內) |
| -mtime n | 修改時間恰好 n 天前 | -mtime 3 (3天前那一天) |
| -mmin +n | 修改時間超過 n 分鐘前 | -mmin +60 (一小時前) |
| -atime | 存取時間 | 同 mtime 語法 |
| -ctime | 狀態改變時間 | 同 mtime 語法 |
設定 Crontab 定時執行
# 編輯 root 排程
sudo crontab -e
# 每天凌晨 1:30 執行清理
30 1 * * * find /var/www/ -type f -mtime +30 -exec rm -f '{}' \;
進階:安全增強版腳本
#!/bin/bash
# safe-cleanup.sh
LOG_FILE="/var/log/cleanup.log"
TARGET_DIR="/var/www"
DAYS=30
echo "=== $(date) Cleanup started ===" >> "$LOG_FILE"
# 乾跑模式:先列出將刪除的檔案
find "$TARGET_DIR" -type f -mtime +"$DAYS" -ls >> "$LOG_FILE"
# 實際刪除(移除 -ls 並取消註解下行)
# find "$TARGET_DIR" -type f -mtime +"$DAYS" -delete >> "$LOG_FILE" 2>&1
echo "=== $(date) Cleanup finished ===" >> "$LOG_FILE"
部署方式:
chmod +x safe-cleanup.sh
# crontab -e
30 1 * * * /path/to/safe-cleanup.sh
關鍵安全提醒
- 先測試:執行
find ... -ls 或 -print 確認匹配檔案無誤後,再啟用刪除
- 保護關鍵目錄:排除重要資料目錄
-not -path "/var/www/important/*"
- 避開系統目錄:絕不可 對
/、/var、/etc、/usr 等系統目錄執行
- 日誌輪替:優先配置
logrotate 管理服務日誌,而非暴力刪除
- 刪除確認:生產環境建議加入
-ok rm -f {} \; 互動確認(非自動化)或移至暫存區保留 7 天
替代方案
- tmpwatch / tmpreaper:專門清理 /tmp、/var/tmp 等暫存目錄
- logrotate:系統日誌標準輪替工具,支援壓縮、郵寄、腳本觸發
- systemd-tmpfiles:現代 systemd 系統內建臨時檔案管理
copyright ©
萬盛學電腦網 all rights reserved