![全局匹配递归删除除某个目录之外的目录](https://linux22.com/image/743280/%E5%85%A8%E5%B1%80%E5%8C%B9%E9%85%8D%E9%80%92%E5%BD%92%E5%88%A0%E9%99%A4%E9%99%A4%E6%9F%90%E4%B8%AA%E7%9B%AE%E5%BD%95%E4%B9%8B%E5%A4%96%E7%9A%84%E7%9B%AE%E5%BD%95.png)
如何以递归方式删除名称以 开头的所有目录(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 -rf
echo
进一步阅读有关 rm + 模式的危险:rm 的创意用途
更新:值得注意的是{} +
应该在命令的末尾,即你不能使用-exec rm {} + -rf