如何遞歸清理父目錄中的所有空檔案和目錄?
假設我有這個目錄結構:
Parent/
|____Child1/
|______ file11.txt (empty)
|______ Dir1/ (empty)
|____Child2/
|_______ file21.txt
|_______ file22.txt (empty)
|____ file1.txt
我應該這樣結束:
Parent/
|____Child2/
|_______ file21.txt
|____ file1.txt
答案1
這是一個非常簡單的襯裡:
find Parent -empty -delete
這是相當不言自明的。儘管當我檢查時我很驚訝它成功刪除了 Parent/Child1。通常,除非您指定,否則您會期望它先處理父項,然後再處理子項-depth
。
這是有效的,因為-delete
意味著-depth
.請參閱GNU 查找手冊:
-delete
刪除文件;如果刪除成功則為 true。如果刪除失敗,則會發出錯誤訊息。如果 -delete 失敗,find 的退出狀態將為非零(當它最終退出時)。使用 -delete 會自動開啟 -deep 選項。
請注意,這些功能不屬於POSIX標準,但很可能在許多 Linux 發行版下都會存在。對於較小的 Linux,例如 Alpine Linux,您可能會遇到特定問題,因為它們是基於忙碌盒不支援-empty
.
答案2
這是兩個命令的解決方案
刪除空白文件
find Parent/ -type f -size 0 -delete
嘗試刪除全部目錄
find Parent/ -type d -depth -print0 | xargs -0 rmdir 2>/dev/null
NBrmdir
無法刪除非空目錄,因此運行是安全的,但會產生錯誤,我們將其隱藏
如上所述,但更具體地說明被忽略的錯誤訊息。如果訊息因發行版而異,則可能需要修改。
find Parent/ -type d -depth -print0 | xargs -0 rmdir 2>&1 \
| grep -iv "Directory not empty$"