由於業務側使用時,一些腳本文件寫的不夠嚴謹,造成/var/spool/postfix/maildrop/目錄經常被用戶通知郵件文件堆滿。而通過rm -rf * 刪除時,會提示-bash: /bin/rm: Argument list too long 。通過ls |xargs rm -rf 進行刪除時也耗時較長,這里可以通過rsync進行刪除。
一、rsync刪除文件
針對上面的問題,我們可以通過以下方法清空該目錄:
先創建一個空目錄 mkdir /tmp/empty/ 清空目標目錄 # rsync --delete-before -avH --progress --stats /tmp/empty/ /var/spool/postfix/maildrop
rsync --delete -rlptD /tmp/empty/ /var/spool/postfix/maildrop/
選項說明:
-delete-before 接收者在傳輸之前進行刪除操作 –progress 在傳輸時顯示傳輸過程 -a 歸檔模式,表示以遞歸方式傳輸文件,並保持所有文件屬性 -H 保持硬連接的文件 -v 詳細輸出模式 –stats 給出某些文件的傳輸狀態
不過在使用上面的命令進行清理時,存在一個問題,清空后,目標目錄的權限會和源目錄的權限一樣。如:/tmp/empty是root:root,而maildrop之前是postfix:postdrop ,執行之后也會maildrop目錄的權限也會變成root:root 。由於-a權限是-rlptogD幾個參數的集合,所以可以將og(owner:group)兩個參數去掉。清空時自動保持之前的目錄權限,如下:
rsync --delete -rlptD /tmp/empty/ /var/spool/postfix/maildrop/
二、rsync與rm 刪除速度比較
為什么rsync這么快呢?
rm刪除內容時,將目錄的每一個條目逐個刪除(unlink),需要循環重復操作很多次;rsync刪除內容時,建立好新的空目錄,替換掉老目錄,基本沒開銷。想要深層次的區分兩個命令在調用系統函數時的區別,可以使用SystemTap工具進行分析(由於本人也不懂該工具的使用,所以這里就不獻丑了)。