![找到工作目录中的所有目录(除了“encoded”),然后将其全部删除](https://linux22.com/image/63064/%E6%89%BE%E5%88%B0%E5%B7%A5%E4%BD%9C%E7%9B%AE%E5%BD%95%E4%B8%AD%E7%9A%84%E6%89%80%E6%9C%89%E7%9B%AE%E5%BD%95%EF%BC%88%E9%99%A4%E4%BA%86%E2%80%9Cencoded%E2%80%9D%EF%BC%89%EF%BC%8C%E7%84%B6%E5%90%8E%E5%B0%86%E5%85%B6%E5%85%A8%E9%83%A8%E5%88%A0%E9%99%A4.png)
我正在尝试测试这个场景,我有这些文件
/encoded
encode <~~~ a bash script
/dir1
/dir2
.../dir2-sub
test.meta
我希望的是,find
搜索当前(除外)编码中的所有目录,然后删除所有目录
我最终使用了这个脚本:
find . -name encoded -prune -o -maxdepth 10 ! -name 'encode*' ! -name '.*' | xargs rm -rf
我相信它会做的是,标记文件夹encoded
然后-prune
它,这样它就会忽略它,对吗?然后对于任何其他没有扩展名的(这确保它们都是目录)通过删除它rm
但问题是...我还有一个没有扩展名的 bash 脚本,所以它最终被删除了
我希望我的 bash 脚本最终从上面的结构完全像这个一样(保持所有非目录完整,不要触摸 /encoded 文件夹及其内容,并且不要删除编码 bash 脚本)
/encoded
encode <~~~ a bash script
test.meta
我怎样才能得到上面的结果?
答案1
您不需要递归枚举目录即可使用rm -rf
;删除它们。您只需列出要删除的顶级目录即可。要确定目录项是否是目录而不是文件,可以使用find
's -type d
test;使用.
并不是一个好的指标。
以下内容应该适合您:
find * -maxdepth 0 ! -name encoded -type d -print0 | xargs -0 rm -rf
这从当前目录中的所有条目开始(以避免列出.
),删除名称为 的任何内容encoded
,并仅保留目录;它使用 null 作为分隔符输出结果,并将结果输入到xargs
Give to rm -rf
。在运行此变体之前,请尝试
find * -maxdepth 0 ! -name encoded -type d
查看输出是否符合您的预期。
-prune
不会忽略它的匹配,它会避免陷入其中;所以在你的例子中,encoded
仍然列出,然后通过测试过滤-name
。