Directory
如何刪除子樹中的所有空目錄?
如何刪除子樹中的所有空目錄?我用過類似的東西
find . -type d -exec rmdir {} 2>/dev/null \;
但我需要執行多次才能刪除僅包含空目錄的目錄。而且,它很慢,尤其是在cygwin下。
結合 GNU
find
選項和謂詞,這個命令應該可以完成這項工作: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
在非空目錄上執行。-empty
GNU 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
收到一個空的命令行時終止。)