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

Ita*_*vka 188 linux shell

我在我的应用程序中使用的导出工具的任务之一是清理.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)

  • 如果目录中可能有空格或这样的字符,您可能需要将{}放入单引号中:`find.-name .svn -exec rm -rf'{}'\;` (43认同)
  • 这个测试在我的bash中效果更好:`find.-name .svn -exec echo {} \;` (38认同)
  • `{} \;`做什么? (6认同)
  • 首先运行echo/ls是这个答案的"专业"触摸.任何傻瓜都可以破坏系统. (5认同)
  • 通过运行包含`ls`的第二个命令,我得到`条目prop-base props text-base tmp`输出... (3认同)
  • @Rasoul尝试@Fedir解决方案:`找到.-name .svn -exec echo {} \;` (2认同)

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并且将首先启动深度.

  • Upvote只是因为你正在使用xargs. (2认同)

A B*_*A B 31

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

find . -name .svn -delete
Run Code Online (Sandbox Code Playgroud)

编辑:开玩笑,显然是在引擎盖下-delete调用unlinkat(),所以它的行为类似于unlinkrmdir将拒绝对包含文件的目录进行操作.

  • 一个问题是,如果包含文件,`-delete`将不会触及目录. (54认同)
  • `-delete谓词没有`-force`或递归标志,所以这个答案没用.因此,它回到了`| xargs rm -rf`,用它丑陋的占位符和分号输入`-exec`就不那么难了:`-exec rm -rf'{}'\;`. (2认同)

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)


sou*_*rge 9

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

find . -type d -name .svn -print0|xargs -0 rm -rf
Run Code Online (Sandbox Code Playgroud)

  • 为了一些共鸣,最终找到了什么.-name .svn | xargs rm -rf你的版本给了我方向,谢谢 (2认同)

Nat*_*lor 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\" \""
Run Code Online (Sandbox Code Playgroud)