首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何从我的应用程序目录中删除所有.svn目录

问如何从我的应用程序目录中删除所有.svn目录
EN

Stack Overflow用户
提问于 2009-08-18 15:20:56
回答 11查看 154.6K关注 0票数 195

我的应用程序中有一个导出工具,它的任务之一是清理应用程序目录树中的所有.svn目录。我正在寻找Linux shell中的递归命令,它将遍历整个树并删除.svn文件。

我没有使用export,因为这个脚本将用于其他一些与SVN无关的文件/目录名称。我试过这样的方法:

代码语言:javascript
复制
find . -name .svn | rm -fr

它不起作用。

EN

回答 11

Stack Overflow用户

回答已采纳

发布于 2009-08-18 15:23:54

试试这个:

代码语言:javascript
复制
find . -name .svn -exec rm -rf '{}' \;

在运行这样的命令之前,我通常喜欢先运行以下命令:

代码语言:javascript
复制
find . -name .svn -exec ls '{}' \;
票数 442
EN

Stack Overflow用户

发布于 2009-08-18 15:39:26

您编写的内容会将换行符分隔的文件名(和路径)列表发送到rm,但是rm不知道如何处理这些输入。它只需要命令行参数。

xargs接受通常由换行符分隔的输入,并将它们放在命令行中,因此添加xargs可以实现以下功能:

代码语言:javascript
复制
find . -name .svn | xargs rm -fr

xargs足够智能,它只会向rm传递它能接受的尽可能多的参数。因此,如果您有一百万个文件,它可能会运行rm 1,000,000/65,000次(如果您的shell可以接受命令行上的65,002个参数{65k文件+1 for rm +1 for -fr})。

正如人们熟练地指出的那样,下面的方法也是可行的:

代码语言:javascript
复制
find . -name .svn -exec rm -rf {} \;
find . -depth -name .svn -exec rm -fr {} \;
find . -type d -name .svn -print0|xargs -0 rm -rf

前两个-exec表单都为要删除的每个文件夹调用rm,因此如果您有1,000,000个文件夹,rm将被调用1,000,000次。这肯定不是很理想。较新的rm实现允许您以+结束命令,这表示rm将接受尽可能多的参数:

代码语言:javascript
复制
find . -name .svn -exec rm -rf {} +

最新的find/xargs版本使用print0,这使得find生成的输出使用\0作为结束符,而不是换行符。由于POSIX系统允许文件名中除\0之外的任何字符,因此这是确保参数正确传递给rm或正在执行的应用程序的最安全的方法。

此外,还有一个-execdir将从找到文件的目录执行rm,而不是从基目录执行;还有一个-depth将首先从深度开始。

票数 52
EN

Stack Overflow用户

发布于 2009-08-18 15:57:49

不需要管道、xargs、exec或任何东西:

代码语言:javascript
复制
find . -name .svn -delete

编辑:只是在开玩笑,显然-delete在幕后调用unlinkat(),所以它的行为类似于unlink或rmdir,并将拒绝对包含文件的目录进行操作。

票数 31
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1294590

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档