我在我的应用程序中使用的导出工具的任务之一是清理.svn应用程序目录树中的所有目录.我在Linux shell中寻找一个递归命令,它将遍历整个树并删除.svn文件.
我没有使用导出,因为此脚本将用于与SVN无关的其他文件/目录名称.我尝试过类似的东西:
find . -name .svn | rm -fr
Run Code Online (Sandbox Code Playgroud)
它不起作用......
Gre*_*reg 432
试试这个:
find . -name .svn -exec rm -rf '{}' \;
Run Code Online (Sandbox Code Playgroud)
在运行这样的命令之前,我经常喜欢先运行它:
find . -name .svn -exec ls '{}' \;
Run Code Online (Sandbox Code Playgroud)
Kal*_*son 51
你写的内容发送了换行符分隔文件名(和路径)的列表rm,但是rm不知道如何处理该输入.它只期望命令行参数.
xargs 获取输入,通常用换行符分隔,并将它们放在命令行上,因此添加xargs会使你的工作成为现实:
find . -name .svn | xargs rm -fr
Run Code Online (Sandbox Code Playgroud)
xargs足够聪明,它只会传递尽可能多的参数rm.因此,如果您有一百万个文件,它可能会运行rm1,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
Run Code Online (Sandbox Code Playgroud)
前两个-exec表单都要求rm删除每个文件夹,因此如果您有1,000,000个文件夹,rm则会调用1,000,000次.这当然不太理想.较新的实现rm允许您使用+指示rm接受尽可能多的参数来结束命令:
find . -name .svn -exec rm -rf {} +
Run Code Online (Sandbox Code Playgroud)
最后一个find/xargs版本使用print0,这使得find生成输出\0用作终结符而不是换行符.由于POSIX系统允许任何字符,但\0在文件名中,这确实是确保正确传递参数rm或正在执行的应用程序的最安全的方法.
此外,还有一个-execdir将从rm找到该文件的目录执行,而不是在基本目录中执行,-depth并且将首先启动深度.
A B*_*A B 31
不需要管道,xargs,exec或任何东西:
find . -name .svn -delete
Run Code Online (Sandbox Code Playgroud)
编辑:开玩笑,显然是在引擎盖下-delete调用unlinkat(),所以它的行为类似于unlink或rmdir将拒绝对包含文件的目录进行操作.
Mne*_*nth 13
已经提供了许多用于删除.svn目录的答案.但我想补充一点,如果你进行导出而不是结帐,你可以从一开始就避免使用这些目录:
svn export <url>
Run Code Online (Sandbox Code Playgroud)
laz*_*zy1 12
如果你不喜欢看很多
find: `./.svn': No such file or directory
Run Code Online (Sandbox Code Playgroud)
警告,然后使用-depth开关:
find . -depth -name .svn -exec rm -fr {} \;
Run Code Online (Sandbox Code Playgroud)
你几乎拥有它.如果要将命令的输出作为参数传递给另一个,则需要使用xargs.添加-print0确保脚本可以处理具有空格的路径:
find . -type d -name .svn -print0|xargs -0 rm -rf
Run Code Online (Sandbox Code Playgroud)
在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\" \""
Run Code Online (Sandbox Code Playgroud)