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

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

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

find . -name .svn | rm -fr

它不起作用..

155878 次浏览

你差点就成功了。如果希望将一个命令的输出作为参数传递给另一个命令,则需要使用xargs.添加-print0确保脚本可以处理带有空格的路径:

find . -type d -name .svn -print0|xargs -0 rm -rf

试试这个:

find . -name .svn -exec rm -v {} \;

developerWorks中了解有关find命令的更多信息。

试试这个:

find . -name .svn -exec rm -rf '{}' \;

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

find . -name .svn -exec ls '{}' \;

如果你不喜欢看到很多

find: `./.svn': No such file or directory

警告,然后使用-depth开关:

find . -depth -name .svn -exec rm -fr {} \;
find . -name .svn |xargs rm -rf

或者,如果您希望在不修改工作副本的情况下导出副本,则可以使用rsync:

rsync -a --exclude .svn path/to/working/copy path/to/export

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

xargs接受输入(通常由换行符分隔),并将它们放在命令行上,因此添加xargs可以完成原来的工作:

find . -name .svn | xargs rm -fr

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

正如人们熟练地指出的那样,以下内容也起作用:

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将接受尽可能多的参数:

find . -name .svn -exec rm -rf {} +

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

此外,还有一个-execdir,它将从找到该文件的目录(而不是基础目录)执行rm,以及一个-depth,它将首先启动深度。

在Windows中,您可以使用以下注册表脚本将“删除SVN文件夹”添加到右键单击上下文菜单中。在任何包含这些讨厌的文件的目录上运行它。

Windows Registry Editor Version 5.00


[HKEY_LOCAL_MACHINE\SOFTWARE\Classes\Folder\shell\DeleteSVN]
@="Delete SVN Folders"


[HKEY_LOCAL_MACHINE\SOFTWARE\Classes\Folder\shell\DeleteSVN\command]
@="cmd.exe /c \"TITLE Removing SVN Folders in %1 && COLOR 9A && FOR /r \"%1\" %%f IN (.svn) DO RD /s /q \"%%f\" \""

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

find . -name .svn -delete

编辑:开个玩笑,显然-delete在后台调用unlinkat(),因此它的行为类似于unlinkrmdir,并将拒绝对包含文件的目录进行操作。

对于删除.svn目录,已经提供了许多答案。但我想补充的是,如果您执行导出而不是签出,则可以从一开始就避免使用这些目录:

svn export <url>

一个重要的问题是,当您想要使用贝壳来删除.svn文件夹时,您需要-深度参数来阻止find命令进入刚刚删除的目录并显示错误消息,例如

"find: ./.svn: No such file or directory"

因此,您可以使用如下所示的find命令:

cd [dir_to_delete_svn_folders]
find . -depth -name .svn -exec rm -fr {} \;