Directory

如何刪除子樹中的所有空目錄?

  • August 28, 2019

如何刪除子樹中的所有空目錄?我用過類似的東西

find . -type d -exec rmdir {} 2>/dev/null \;

但我需要執行多次才能刪除僅包含空目錄的目錄。而且,它很慢,尤其是在cygwin下。

結合 GNUfind選項和謂詞,這個命令應該可以完成這項工作:

find . -type d -empty -delete
  • -type d限制在目錄
  • -empty限制為空的
  • -delete刪除每個目錄

樹是從葉子中走出來的,不需要指定-depth,因為它是由 暗示的-delete

首先列出深度嵌套的目錄。

find . -depth -type d -exec rmdir {} \; 2>/dev/null

(請注意,重定向適用於整個find命令,而不僅僅是適用於rmdir. 僅重定向rmdir會導致顯著減速,因為您需要呼叫中間 shell。)

您可以通過將謂詞傳遞給 find來避免rmdir在非空目錄上執行。-emptyGNU find 會在即將執行命令時測試目錄,因此將拾取剛剛清空的目錄。

find . -depth -type d -empty -exec rmdir {} \;

另一種加快速度的方法是將rmdir呼叫分組。兩者都可能明顯快於原始版本,尤其是在 Cygwin 下。我不希望這兩者之間有太大區別。

find . -depth -type d -print0 | xargs -0 rmdir 2>/dev/null
find . -depth -type d -exec rmdir {} + 2>/dev/null

哪種方法更快取決於您擁有多少個非空目錄。您不能-empty與對呼叫進行分組的方法結合使用,因為那時僅包含空目錄的目錄在find查看它們時並不為空。

另一種方法是執行多遍。這是否更快取決於很多事情,包括整個目錄層次結構是否可以在find執行之間保留在磁碟記憶體中。

while [ -n "$(find . -depth -type d -empty -print -exec rmdir {} +)" ]; do :; done

或者,使用 zsh。glob 限定符 F匹配非空目錄,因此匹配/^F空目錄。只包含空目錄的目錄不能那麼容易匹配。

while rmdir **/*(/N^F); do :; done

(當rmdir收到一個空的命令行時終止。)

引用自:https://unix.stackexchange.com/questions/8430