如何从我的应用程序目录中删除所有.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
前两个-exec
forms都会为每个被删除的文件夹调用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()
在引擎盖下,所以它的行为就像unlink
或rmdir
并会拒绝在包含文件的目录上操作。
如果你不喜欢看到很多
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