【问题标题】:How to remove all .svn directories from my application directories如何从我的应用程序目录中删除所有 .svn 目录
【发布时间】:2009-08-18 15:20:56
【问题描述】:

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

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

find . -name .svn | rm -fr

没用……

【问题讨论】:

  • 如果你使用'xargs rm -rf',你的命令应该可以工作
  • 您可能还想修改删除命令“rm -rfi”,以确保您确定要删除目录。
  • 虽然不要使用 xargs .. 目录中包含空格等会有问题。使用 find 如下所述。

标签: linux shell


【解决方案1】:

试试这个:

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

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

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

【讨论】:

  • 如果目录中可能有空格或此类字符,您可能需要将{}放在单引号中:find . -name .svn -exec rm -rf '{}' \;
  • 这个测试在我的 bash 中效果更好:find . -name .svn -exec echo {} \;
  • 首先运行 echo / ls 是对这个答案的“专业”接触。任何傻瓜都可以破坏系统。
  • {} \; 是做什么的?
  • 通过运行包括ls 在内的第二个命令,我得到entries prop-base props text-base tmp 输出...
【解决方案2】:

您编写的内容将换行符分隔的文件名(和路径)列表发送到rm,但 rm 不知道如何处理该输入。它只需要命令行参数。

xargs 接受输入,通常用换行符分隔,并将它们放在命令行上,因此添加 xargs 可以使您的工作正常:

find . -name .svn | xargs rm -fr

xargs 足够智能,它只会将尽可能多的参数传递给rm,因为它可以接受。因此,如果您有一百万个文件,它可能会运行rm 1,000,000/65,000 次(如果您的 shell 可以在命令行上接受 65,002 个参数 {65k files + 1 for rm + 1 for -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 将首先开始深度。

【讨论】:

    【解决方案3】:

    如果你不喜欢看很多

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

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

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

    【讨论】:

      【解决方案4】:

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

      svn export <url>
      

      【讨论】:

      • +1,svn已经内置了就不用重做了。
      • 我看到这种方法的唯一问题是您是否想在导出中保留未版本控制的文件。从 svn 文档中,“所有本地更改都将被保留,但不受版本控制的文件将不会被复制。”
      • @raidfive:通常我更喜欢将所有相关文件置于版本控制之下,甚至使用过的库,以便项目开箱即用。此设置中的未版本化文件是已编译的二进制文件,由构建文件中的目标重新制作。但你是对的,如果你的项目依赖于不受版本控制的文件,那么导出将不起作用。
      • 但是...我需要一个更笼统的答案。 .svn 只是最常见的例子,我在问题中指出了这一点。
      【解决方案5】:

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

      【讨论】:

      • 巧妙的把戏。对 OP 没有帮助,但 +1 因为我印象深刻!
      • 这太棒了。谢谢。我知道这是超级旧的,但无论如何。无论如何我都喜欢它。
      【解决方案6】:

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

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

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

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

      【讨论】:

      • 这是我一直在寻找的,应该是正确的答案。
      【解决方案7】:

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

      find . -name .svn -delete
      

      编辑:开个玩笑,显然-delete 在后台调用unlinkat(),所以它的行为类似于unlinkrmdir,并且会拒绝对包含文件的目录进行操作。

      【讨论】:

      • 一个问题,-delete 不会触及包含文件的目录。
      • 没有-force-delete 谓词的递归标志,所以这个答案是没用的。因此,它又回到了|xargs rm -rf,与带有丑陋占位符和分号的-exec 相比,它的输入更不难看:-exec rm -rf '{}' \;
      【解决方案8】:

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

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

      【讨论】:

      • 出于某种原因,最终起作用的是 find 。 -name .svn |xargs rm -rf 你的版本给了我方向,谢谢
      【解决方案9】:
      find . -name .svn |xargs rm -rf
      

      【讨论】:

        【解决方案10】:

        试试这个:

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

        developerWorks 上阅读有关 find 命令的更多信息。

        【讨论】:

          【解决方案11】:

          或者,如果你想导出一个副本而不修改工作副本,你可以使用 rsync:

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

          【讨论】:

          • 或者使用 svn export /path/to/repository,本质上做同样的事情。
          • 作者特意说不想用svn;也许他的目标环境没有安装svn。
          猜你喜欢
          • 2015-01-20
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2015-03-10
          • 1970-01-01
          • 2012-05-11
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多