Bash

glob匹配遞歸刪除除某個目錄以外的目錄

  • August 24, 2020

如何以遞歸方式刪除名稱以開頭的所有目錄,app-deployment-*但具有名稱的特定目錄除外app-deployment-245a578。IE 使用全域匹配刪除所有目錄,但不刪除特定的已知命名目錄。

rm -rf app-deployment-* # except app-deployment-245a578
find ./ -maxdepth 1 \
       -type d \
       -name 'app-deployment-*' \
       ! -name 'app-deployment-245a578' \
       -exec echo rm -rf {} +

說明:

  • -maxdepth 1沒有遞歸的意思;
  • -type d意味著只搜尋目錄;
  • -name 'app-deployment-*'是您正在搜尋的目錄模式;
  • ! -name 'app-deployment-245a578'是您從結果列表中排除的目錄模式 如果要排除

多個目錄,請重複多次;

  • exec echo rm -rf– 執行命令echo rm -rf
  • {} +– 將搜尋結果作為參數添加到上面的命令中。

目錄名稱將像這樣添加:echo rm -rf dir1 dir2 dir3.

關於最後一點。如果你想用每個參數分別呼叫命令(我的意思是echo rm -rf dir1; echo rm -rf dir2;),你應該寫{} \;(注意反斜杠)而不是{} +.

關於命令。我寫echo rm -rf而不是因為使用任何類型的模式匹配rm -rf的所有危險。在從命令中rm -rf刪除之前要小心並檢查所有內容。echo

進一步閱讀有關 rm + 模式的危險: rm的創造性使用

**UPD:**值得注意的是{} +應該在命令的末尾,即不能使用-exec rm {} + -rf

引用自:https://serverfault.com/questions/986133