我的应用程序中具有导出工具的任务之一是清除.svn
应用程序目录树中的所有目录。我正在Linux外壳中寻找一个递归命令,它将遍历整个树并删除.svn
文件。
我不使用导出,因为此脚本将用于与SVN不相关的其他文件/目录名称。我尝试了类似的东西:
find . -name .svn | rm -fr
没用...
我的应用程序中具有导出工具的任务之一是清除.svn
应用程序目录树中的所有目录。我正在Linux外壳中寻找一个递归命令,它将遍历整个树并删除.svn
文件。
我不使用导出,因为此脚本将用于与SVN不相关的其他文件/目录名称。我尝试了类似的东西:
find . -name .svn | rm -fr
没用...
Answers:
试试这个:
find . -name .svn -exec rm -rf '{}' \;
在运行这样的命令之前,我经常喜欢先运行以下命令:
find . -name .svn -exec ls '{}' \;
find . -name .svn -exec rm -rf '{}' \;
find . -name .svn -exec echo {} \;
{} \;
办?
ls
,我得到entries prop-base props text-base tmp
输出...
您所写的内容将一个用换行符分隔的文件名(和路径)列表发送到rm
,但是rm不知道如何处理该输入。只需要命令行参数。
xargs
接受通常由换行符分隔的输入,并将其放置在命令行上,因此添加xargs可以完成您的工作:
find . -name .svn | xargs rm -fr
xargs
足够聪明,它只会传递尽可能多的参数rm
。因此,如果您有一百万个文件,它可能会运行rm
1,000,000 / 65,000次(如果您的shell可以在命令行上接受65,002个参数{65k个文件+ rm 1个--fr 1个)。
正如人们熟练地指出的那样,以下内容也可以工作:
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
,并且将从深度开始。
不需要管道,xargs,exec或其他任何东西:
find . -name .svn -delete
编辑:开个玩笑,显然是在后台-delete
调用unlinkat()
,因此它的行为类似于unlink
或,rmdir
并且将拒绝对包含文件的目录进行操作。
-delete
如果目录包含文件,则不会涉及目录。
-force
或递归标志-delete
,因此此答案无用。因此,它返回到|xargs rm -rf
,而不是-exec
使用其丑陋的占位符和分号:进行输入-exec rm -rf '{}' \;
。
对于删除.svn目录,已经提供了许多答案。但我想补充一点,如果您执行导出而不是签出操作,则可以从一开始就避免使用这些目录:
svn export <url>
在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。添加-print0
可确保脚本可以处理带有空格的路径:
find . -type d -name .svn -print0|xargs -0 rm -rf
find . -name .svn |xargs rm -rf
另外,如果要导出副本而不修改工作副本,则可以使用rsync:
rsync -a --exclude .svn path/to/working/copy path/to/export