在工作目录中找到所有目录(除了`encoded`)然后删除所有它们

arv*_*vil 3 find shell-script rm

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

/encoded
encode <~~~ a bash script
/dir1
/dir2
.../dir2-sub
test.meta
Run Code Online (Sandbox Code Playgroud)

我希望的是,find搜索我们当前(除外)编码中的所有目录,然后删除所有目录

我最终使用了这个脚本:

find . -name encoded -prune -o -maxdepth 10 ! -name 'encode*' ! -name '.*' | xargs rm -rf

我相信它会做的是,标记文件夹encoded然后-prune它,所以它会忽略它,对吧?然后对于没有扩展名的任何其他人(确保所有这些都是目录)通过以下方式删除它rm

但问题是......我也有一个没有扩展名的bash脚本,所以它最终被删除了

我希望我的 bashscript 从上面的结构结束到完全一样(保持所有非目录完好无损,不要触摸 /encoded 文件夹及其内容,不要删除编码 bash 脚本)

/encoded
encode <~~~ a bash script
test.meta
Run Code Online (Sandbox Code Playgroud)

我怎样才能得到上面的结果?

Ste*_*itt 5

您不需要递归枚举目录来删除它们rm -rf;您可以简单地列出要删除的顶级目录。要确定目录条目是否是目录而不是文件,可以使用find's -type dtest; using.不是一个好的指标。

以下应该对您有用:

find * -maxdepth 0 ! -name encoded -type d -print0 | xargs -0 rm -rf
Run Code Online (Sandbox Code Playgroud)

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

find * -maxdepth 0 ! -name encoded -type d
Run Code Online (Sandbox Code Playgroud)

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

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