找到工作目录中的所有目录(除了“encoded”),然后将其全部删除

找到工作目录中的所有目录(除了“encoded”),然后将其全部删除

我正在尝试测试这个场景,我有这些文件

/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 dtest;使用.并不是一个好的指标。

以下内容应该适合您:

find * -maxdepth 0 ! -name encoded -type d -print0 | xargs -0 rm -rf

这从当前目​​录中的所有条目开始(以避免列出.),删除名称为 的任何内容encoded,并仅保留目录;它使用 null 作为分隔符输出结果,并将结果输入到xargsGive to rm -rf。在运行此变体之前,请尝试

find * -maxdepth 0 ! -name encoded -type d

查看输出是否符合您的预期。

-prune不会忽略它的匹配,它会避免陷入其中;所以在你的例子中,encoded仍然列出,然后通过测试过滤-name

相关内容