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

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

我没有使用导出,因为这个脚本将被用于一些其他的文件/目录名称是不相关的SVN。 我尝试了这样的:

 find . -name .svn | rm -fr 

它没有工作…

尝试这个:

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

在运行这样的命令之前,我经常首先运行这个命令:

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

你写的是向rm发送一个换行符分隔的文件名(和path)列表,但是rm不知道如何处理这个input。 它只是期待命令行参数。

xargs接受input,通常用换行符分隔,并将它们放在命令行上,所以添加xargs使得你的工作成为可能:

 find . -name .svn | xargs rm -fr 

xargs是足够聪明的,它只会通过尽可能多的论据,因为它可以接受。 因此,如果你有一百万个文件,它可能会运行RM100,000 / 65,000次(如果你的shell可以在命令行上接受65,002个参数{65k文件+ 1,rm + 1为-fr})。

正如人们熟练地指出的那样,以下也是有效的:

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

前两个-execforms都会为每个被删除的文件夹调用rm ,所以如果你有1,000,000个文件夹, rm将被调用1000000次。 这当然不是理想的。 较新的rm实现允许你使用+来结束命令,表示rm将接受尽可能多的参数:

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

最后一个find / xargs版本使用print0,它使查找生成输出使用\0作为终止符而不是换行符。 由于POSIX系统在文件名中允许任何字符,但\0 ,这确实是确保参数正确传递给rm或正在执行的应用程序的最安全的方法。

另外,还有一个-execdir ,它将从find该文件的目录中执行rm ,而不是从基本目录和一个深度优先的-depth

不需要pipe道,xargs,exec或任何东西:

 find . -name .svn -delete 

编辑:只是开玩笑,显然unlinkat()调用unlinkat()在引擎盖下,所以它的行为就像unlinkrmdir并会拒绝在包含文件的目录上操作。

如果你不喜欢看到很多

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

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

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

已经提供了许多用于删除.svn目录的答案。 但是我想补充一点,你可以从一开始就避免这些目录,如果你做了一个导出而不是结帐:

 svn export <url> 

你几乎已经拥有了。 如果您想将命令的输出作为parameter passing给另一个命令,则需要使用xargs。 添加-print0确保脚本可以用空格处理path:

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

在Windows中,可以使用以下registry脚本将“删除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\" \"" 
 find . -name .svn |xargs rm -rf 

作为一个重要的问题,当你想利用shell来删除.svn文件夹时,你需要使用-depth参数来防止find命令进入刚被删除的目录,并显示如eg

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

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

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

尝试这个:

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

在developerWorks上阅读关于find命令的更多信息。

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

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