【问题标题】:Command line to delete all ClearCase view-private files用于删除所有 ClearCase 视图私有文件的命令行
【发布时间】:2008-12-15 21:04:36
【问题描述】:

我正在寻找一个命令行来从 Windows 上的 ClearCase 视图中删除所有视图私有文件和目录。我也有 Cygwin。

this article 上提供的脚本并不是我想要的,因为我正在处理大量文件并且想要将它们全部删除而不必选择每个文件。

【问题讨论】:

  • 刚刚添加了一个更通用的命令行。如果您有任何意见/问题,我将在明天早上查看您的评论/问题。

标签: bash cygwin clearcase


【解决方案1】:

几点说明:

  • ct lsprivate 非常适合动态视图,而不是快照视图
  • ct ls -rec -view_onlyct lsprivate 还列出了您签出的文件...我不确定您是否要删除这些...

要列出私人文件(仅私人文件,而不是您可能想要保留的被劫持文件),您需要有一个命令:

  • 考虑名称中的空格
  • 不列出结帐或被劫持或重叠的文件或符号链接
  • 适用于快照和动态视图
  • (奖励)不依赖于外部 shell 命令

    for /F "usebackq delims=" %i in (`cleartool ls -r ^| find /V "Rule:" ^| find /V "hijacked" ^| find /V "eclipsed" ^| find /V "-->"`) do @echo "%i"

这会以纯 Windows 方式(无需外部 shell 依赖)列出您的所有私有文件(跳过被劫持/eclipse/签出或非私有文件以及符号链接)。
@echo "%i" 替换为del /F "%i",它们就消失了。
请注意 %i 周围的双引号,以便正确显示/删除名称中带有空格的文件。 另请注意 cleartool 参数 -nxn 的缺失,否则符号链接将无法区分,并且无论如何都不会修饰视图私有文件。

为了也摆脱私有目录,首先使用rmdir /S /Q "%i" 运行命令,然后使用del /F "%i"

【讨论】:

  • 你说得对,我的方式非常符合我当时的目的。我没有任何结帐,我绝对想要一次性文件和目录。所以,有点折衷,但对于大多数用途来说,通用可能胜过运行两次。
  • @Sven:编辑看起来不错。如果您已经对其进行了测试,我感谢您的改进。
  • 我运行该命令的后续时间,它运行非常慢到超时。你知道为什么会这样吗?
  • @TDN 并非如此:这取决于视图的性质,以及客户端和视图服务器之间的网络。
  • @TDN 您可以尝试将该命令包装在cmd /C 调用中吗? cmd /C "..."。同样在脚本中,您需要启用延迟扩展,并使用%%i 而不是%i
【解决方案2】:

windows DOS提示符下:

for /f "delims=" %f in ('cleartool lspriv -s -do -oth ^| sort /r') do @del /f /q "%f"

【讨论】:

    【解决方案3】:

    我知道可能有更好的方法,但我似乎总是回到这个:

    ct lspriv | grep -v checkedout | xargs rm -rf
    

    【讨论】:

      【解决方案4】:

      我一直用:

      ct lsprivate  | xargs rm
      

      【讨论】:

      • 我也是,但需要注意的是,我先运行 'ct lsco -cvi -s -avo' 来查找所有签出的文件,然后在删除私人文件之前取消这些签出。
      • 有没有想过为什么一个 4 年前的帖子会突然吸引反对票,却没有解释为什么会被反对?我愿意。
      • 在那些情况下确实让我感到困惑,幸运的是相当罕见,当它发生时。这也很烦人,但我认为对于不明原因的偷渡式投票,我无能为力,除非有人对我进行疯狂投票(这也没有发生)。
      • 我得到以下错误“csh:参数列表太长。(C shell 没有限制,但 Windows NT 内核确实限制了 32,282 个字符。)”
      【解决方案5】:

      在 Unix(动态视图)上,删除视图私有文件的一种非常有效的技术是删除视图。首先保留 cspec。还要确保视图中没有结帐。然后删除它并重新创建一个新文件(相同的名称、相同的 cspec、相同的存储,但在创建它们之前没有私有文件)。

      # With the view to be cleaned as your current view...
      ct pwv -s > /tmp/viewname
      viewname=$(</tmp/viewname)
      ct catcs > /tmp/$viewname.cs
      ct lsview -cvi | awk '{print $3;}' > /tmp/$viewname.vws
      # The next line is the first dangerous line!
      # It cancels all outstanding checkouts and removes the modified files
      ct lsco -cvi -s -avo 2>/dev/null | xargs ct unco -rm  # Or: xargs ct ci -nc
      exit            # Terminate the session in the view
      viewname=$(</tmp/viewname)
      rm /tmp/viewname
      # The next line is the second dangerous line
      ct rmview -tag $viewname
      ct mkview -tag $viewname $(</tmp/$viewname.vws)
      ct setcs  -tag $viewname /tmp/$viewname.cs
      rm /tmp/$viewname.cs
      

      所有查看私有文件都消失了 - 您已将磁盘使用量降至最低。

      如果您有幸只使用单个 VOB,则可以省略“-avo”(所有 VOB)选项。 '2&gt;/dev/null' 重定向会丢失来自无法访问的 VOB 的错误 - 我的环境中有 100 多个可见但无法访问的 VOB,除了我真正使用的十几个可访问的 VOB。

      请注意,如果您将其打包为“rebuild.view”脚本,您会将视图名称作为参数(从视图外部工作 - 它不会是当前视图),然后您可以执行清理视图内部,使用不同的 'lsview' 选项来获取所需的详细信息,并且通常远离 /tmp 中的临时存储(尽管您需要在某处缓存 cspec)。

      还有一点需要注意 - 您需要确保在自动松开之前已完成手动清理。例如,不应该有结帐。或者,编写脚本以在有任何结帐时拒绝删除视图。

      【讨论】:

        【解决方案6】:

        我最终在 Cygwin 中使用了这个命令:

        cleartool ls -recurse -view_only | sed -e 's:\\:/:g' | xargs rm -r
        

        sed 是将 cleartool 输出的 Windows 样式路径更改为 Unix 样式路径所必需的。那里可能有更有效的命令。这会引发很多错误,因为它会删除目录,然后 rm 将找不到该目录下的任何先前找到的视图私有文件。但最终你会得到正确的结果。

        编辑:VonC 指出这只适用于动态 ClearCase 视图

        【讨论】:

          【解决方案7】:
          1. 从 CLI 列出查看私有文件,执行以下命令

            for /F "usebackq delims=" %i in (`cleartool lspriv -s ^| find /V "Rule:" ^| find /V "hijacked" ^| find /V "eclipsed"`) do @echo "%i"
            
          2. 从执行以下命令的 CLI 删除查看私有文件

            for /F "usebackq delims=" %i in (`cleartool lspriv -s ^| find /V "Rule:" ^| find /V "hijacked" ^| find /V "eclipsed"`) do del /F "%i"
            
          3. 将视图与项目同步:
            从项目资源管理器中选择流属性,转到视图选项卡,选择视图属性然后单击“与项目同步”

          【讨论】:

            【解决方案8】:

            用 cygpath 命令代替 sed 怎么样?
            您可以在此处找到有关 cygpath.exe 的更多信息:
            link text

            将 cygpath.exe 与其他程序链接的一种方法是使用 xargs。
            示例:进程A | xargs cygpath -u > my-path-in-unix-format.txt

            【讨论】:

            • 我想不出将它与其他命令串在一起的正确方法。如果您能想出它,请编辑您的答案以表明这一点;希望它会帮助别人。
            【解决方案9】:

            在纯窗口中你可以这样做:

            for /F "delims=" %i IN ('ct lsprivate') DO rm -rf "%i"
            

            【讨论】:

              猜你喜欢
              • 2016-11-07
              • 2023-04-04
              • 1970-01-01
              • 1970-01-01
              • 2013-03-24
              • 1970-01-01
              • 1970-01-01
              • 2010-10-06
              • 2021-04-24
              相关资源
              最近更新 更多