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

时间:2009-08-18 15:20:56

标签: linux shell

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

我没有使用导出,因为此脚本将用于与SVN无关的其他文件/目录名称。我试过像:

find . -name .svn | rm -fr

它不起作用......

11 个答案:

答案 0 :(得分:428)

试试这个:

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

在运行这样的命令之前,我经常喜欢先运行它:

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

答案 1 :(得分:51)

您所写的内容会将新行分隔的文件名(和路径)列表发送到rm,但rm不知道如何处理该输入。它只是期望命令行参数。

xargs接受输入,通常用换行符分隔,并将它们放在命令行上,因此添加xargs会使你的工作成为现实:

find . -name .svn | xargs rm -fr

xargs足够聪明,它只能传递尽可能多的rm参数。因此,如果您有一百万个文件,它可能会运行rm 1,000,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表单都会为每个要删除的文件夹调用rm,因此如果您有1,000,000个文件夹,rm将被调用1,000,000次。这当然不太理想。较新的rm实现允许您使用+结束命令,指示rm将接受尽可能多的参数:

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

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

此外,还有一个-execdir将从找到该文件的目录中执行rm,而不是在基本目录中执行-depth,而{{1}}将首先启动深度。

答案 2 :(得分:31)

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

find . -name .svn -delete

修改:开玩笑,显然-delete来电unlinkat(),因此它的行为类似unlinkrmdir,并拒绝对包含文件的目录进行操作。

答案 3 :(得分:12)

为删除.svn目录已经提供了很多答案。但我想补充一点,如果你进行导出而不是结账,你可以从一开始就避免使用这些目录:

svn export <url>

答案 4 :(得分:11)

如果你不喜欢看很多

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

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

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

答案 5 :(得分:9)

你几乎拥有它。如果要将命令的输出作为参数传递给另一个,则需要使用xargs。添加-print0可确保脚本可以处理具有空格的路径:

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

答案 6 :(得分:9)

在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\" \""

答案 7 :(得分:4)

find . -name .svn |xargs rm -rf

答案 8 :(得分:4)

作为一个重要问题,当您想利用 shell 删除.svn文件夹时需要 -depth 参数来阻止find命令进入刚删除的目录显示错误消息,例如

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

因此,您可以使用如下命令:

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

答案 9 :(得分:3)

试试这个:

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

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

答案 10 :(得分:2)

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

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