如何遞歸刪除Linux中的所有空檔案和目錄?

如何遞歸刪除Linux中的所有空檔案和目錄?

如何遞歸清理父目錄中的所有空檔案和目錄?

假設我有這個目錄結構:

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.

其他確實包括非標準系統-empty-delete包括BSD作業系統X但顯然不是AIX

答案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$"

答案3

您也可以使用該fd工具執行此操作:

fd -t e -x rm -r

https://github.com/sharkdp/fd

相關內容