全局匹配递归删除除某个目录之外的目录

全局匹配递归删除除某个目录之外的目录

如何以递归方式删除名称以 开头的所有目录(app-deployment-*特定目录除外)app-deployment-245a578。IE 使用 glob 匹配删除所有目录,但不删除特定的已知命名目录。

rm -rf app-deployment-* # except app-deployment-245a578

答案1

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 -rfecho

进一步阅读有关 rm + 模式的危险:rm 的创意用途

更新:值得注意的是{} +应该在命令的末尾,即你不能使用-exec rm {} + -rf

相关内容