find /path/to/dir -mtime +N -type f -name 'pattern' -exec rm -f {} \;
| 參數 | 含義 |
|---|---|
/path/to/dir | 目標目錄(遞迴搜尋) |
-mtime +N | 修改時間超過 N 天(+30 表示 30 天前,不含第 30 天) |
-type f | 僅匹配一般檔案(不含目錄、連結等) |
-name 'pattern' | 檔名模式(支援萬用字元 *、?、[...]) |
-exec rm -f {} \; | 對每個結果執行 rm -f;{} 為佔位符,\; 結束 |
find /tmp -mtime +30 -type f \( -name "*.sh" -o -name "*.log" \) -exec rm -f {} \;
find /var/log -mtime +7 -type f -name "*.gz" -size +100M -exec rm -f {} \;
find /data/backup -mtime +30 -type f -print0 | xargs -0 rm -f
優勢: -print0 + xargs -0 以 null 字元分隔,安全處理含空白/特殊字元的檔名;單次 rm 處理多檔,減少進程啟動開銷。
vim /etc/crontab
# 每天凌晨 3:30 清理 /data/logs 30 天前的 .log 檔
30 3 * * * root find /data/logs -mtime +30 -type f -name "*.log" -exec rm -f {} \;
crontab -e
# 每天 02:00 清理
0 2 * * * find /home/user/tmp -mtime +7 -type f -exec rm -f {} \;
#!/bin/bash
# clean_old.sh
TARGET_DIR="/data/logs"
DAYS=30
LOG_FILE="/var/log/clean_old.log"
find "$TARGET_DIR" -mtime +$DAYS -type f -name "*.log" -print0 |
while IFS= read -r -d '' file; do
echo "$(date '+%F %T') 刪除: $file" >> "$LOG_FILE"
rm -f "$file"
done
給予執行權限 chmod +x clean_old.sh,crontab 呼叫腳本即可。
-mtime +0 表示「超過 0 天」即 24 小時前,而非「今天」。-ctime(inode 變更時間)≠ -mtime(內容修改時間)≠ -atime(存取時間),請根據業務選擇。-type f 刪除,但空目錄會殘留,需定期 find -type d -empty -delete 清理。x(進入)與 w(刪除檔案)權限。find -mtime +N -type f -exec rm -f {} \; 是 Linux 定時清理舊檔的標準組合。搭配 xargs 提升效能、-print0 處理特殊檔名、crontab 定時自動化、腳本記錄審計,即可構建安全、高效、可追蹤的檔案生命週期管理機制。