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)
我怎样才能得到上面的结果?
您不需要递归枚举目录来删除它们rm -rf
;您可以简单地列出要删除的顶级目录。要确定目录条目是否是目录而不是文件,可以使用find
's -type d
test; 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
测试过滤。