find 是 Linux 最強大的檔案搜尋工具,配合 -exec 或 -delete 可實現複雜條件下的批次刪除。本文整理按時間、大小、權限、類型、擁有者等多維度條件刪除檔案的實戰指令,並說明常見陷阱。
find [路徑] [條件] [動作]
# 常用動作:-print (預設) | -delete | -exec cmd {} \;
| 參數 | 含義 | 範例:刪除 /var/log 下 30 天前的 .log 檔 |
|---|---|---|
| -mtime +n | 修改時間超過 n 天前 | find /var/log -name "*.log" -mtime +30 -delete |
| -mtime -n | 修改時間在 n 天內 | find /var/log -name "*.log" -mtime -7 -delete |
| -atime +n | 存取時間超過 n 天前 | find /home -atime +90 -delete |
| -ctime +n | 狀態改變時間超過 n 天前 | find /tmp -ctime +1 -delete |
| -mmin +n | 修改時間超過 n 分鐘前 | find /tmp -mmin +60 -delete |
注意: +n 表示「大於 n」,-n 表示「小於 n」,n 表示「恰好 n」(極少用)。
# 刪除超過 100MB 的檔案
find / -type f -size +100M -delete
# 刪除小於 1KB 的空檔/臨時檔
find /var/cache -type f -size -1k -delete
# 刪除恰好 20 bytes 的檔案
find . -name "*.c" -size 20c -delete
單位:c(bytes)、k(KB)、M(MB)、G(GB)。
# 刪除權限為 640 的檔案
find /home -type f -perm 640 -delete
# 刪除屬於用戶 tom 的檔案
find / -user tom -delete
# 刪除屬於群組 www 的檔案
find /var/www -group www -delete
# 僅刪除符號連結(不刪除目標檔)
find / -type l -delete
# 僅刪除普通檔案(保留目錄)
find . -type f -name "*.tmp" -delete
# 刪除 /data 下、屬於 www、超過 7 天、大於 10MB 的 .log 檔
find /data -user www -name "*.log" -mtime +7 -size +10M -delete
# 刪除 /tmp 下、非 root 擁有、存取超過 1 天的所有檔案
find /tmp ! -user root -atime +1 -delete
# 刪除兩種副檔名檔案
find . \( -name "*.xml" -o -name "*.sh" \) -delete
find ... -print 確認列表;-delete 為原子操作,避免競態條件,效率更高;-maxdepth 或指定具體目錄;find . -type f -print 後直接加 -delete 會報錯 → -print 與 -delete 不能共用,若需列印改用 -exec echo {} \;;-type d 並配合 -empty(僅空目錄)或 -exec rm -rf {} \;(非空目錄,極度危險)。熟練 find 組合拳,讓磁碟清理精準且安全。
