【问题标题】:ClearCase: Find files having exactly one specific label and not moreClearCase:查找仅具有一个特定标签而不是更多的文件
【发布时间】:2009-06-24 10:55:06
【问题描述】:

我想在 ClearCase 中查找标有特定标签但没有设置任何其他标签的文件。

例如,如果我有这样标记的文件:

file1 LBL_A, LBL_B
file2 LBL_A

我想要一个只给我 file2 而不是 file1 的查询。

有没有办法用 cleartool find 做到这一点?如果这不可能通过单个查询来完成,我也会很高兴知道如何通过几个步骤来执行此操作(我将从 perl 脚本调用 cleartool,因此保存文件列表会很容易暂时并在它们上运行进一步的命令)。

提前非常感谢!

一月

【问题讨论】:

  • 刚刚更新了我的命令行以显示版本而不是元素

标签: clearcase labels cleartool


【解决方案1】:

假设 LBL_A 是您想要运行的(唯一)标签

cleartool find /some/dir -version 'lbtype(LBL_A)' -print | xargs cleartool describe -fmt "%n: %l"

应该给

file1: (LBL_A, LBL_B)
file2: (LBL_A)

作为输出,您可以检查您的 perl 脚本或通过 sed -n 's/\(.*\): (LBL_A)/\1/p' 过滤(假设文件名中没有冒号)。

更新:正如 VonC 正确指出的那样,上面的命令对于包含空格的文件将失败。处理该运行为:

cleartool find ... -print | tr '\012' '\000' | xargs -0 cleartool ....

这会将换行符转换为 ascii null,然后让 xargs 将其用作分隔符。

【讨论】:

  • @hlovdal 你没有错过任何东西(就像我一样)。我刚刚取消了反对票并重写了我的帖子:)
  • @hlovdal 我修复了我的帖子并提出了另一种(简单)方法来过滤结果。由于您的帖子关注基本上是正确的:+​​1
  • 谢谢,这正是我需要的!
【解决方案2】:

您可以直接执行此操作而无需管道:

cleartool find . -ver "lbtype(LBL_A) && !lbtype(LBL_B)" -print

【讨论】:

  • 有人验证这是否真的有效吗?听起来比事后过滤 cleartool 输出更有效的解决方案。当然,这种方法并不能完全回答这个问题,除非人们确切地知道可能会出现什么标签。
【解决方案3】:

hlovdal's answer 说明,在这种情况下,您必须找到比您需要的更多的元素,然后过滤它们(尽管有所有 ClearCase find features)。

注意:

 cleartool find . -type f -element 'lbtype_sub(LBL_A)' -print

可以直接为您提供元素(而不是在这种情况下可能不感兴趣的版本)。您可以找到带有-version 和格式指令的版本,如下所述。

fmt_ccase 的帮助下,您可以定制输出以准确地获得您的 perl 脚本需要继续执行的操作:

 cleartool find . -type f -element 'lbtype_sub(LBL_A)' -exec 'cleartool describe -fmt "%En %Cl\n" \"$CLEARCASE_XPN\"' | grep -v ","
  • -fmt "%En %l\n" 将显示 元素 的完整路径(而不是版本:/a/b/myFile@@/main/myVersion)=> /a/b/myFile'. the '\n` 确保每行一个结果。
  • -version-fmt "%n %l\n" 会显示版本
  • \"$CLEARCASE_XPN\":双引号包围找到的版本的扩展路径,确保名称中包含空格的文件仍然有效。
  • grep -v ",":如果有逗号,表示“多个标签”
  • %Cl:避免显示 all 标签列表。反正如果不止一个,你就没兴趣了!

所以,要找到确切的版本

 cleartool find . -type f -version 'lbtype_sub(LBL_A)' -exec 'cleartool describe -fmt "%n %Cl\n" \"$CLEARCASE_XPN\"' | grep -v ","|awk '{sub(/ \(.*/,"");print}'

注意:
以上适用于unix语法。 windows 的语法是:

cleartool find . -type f -element "lbtype(LBL_A)" -exec "cleartool describe -fmt \"%n %Cl\n\" \"%CLEARCASE_XPN%\"" | grep -v "," | gawk "{gsub(/ \(.*,"");print}"

,它会列出只有一个(正确)标签的文件版本。

  • awk '{sub(/ \(.*/,"");print}' 会将“myFile@@/main/myVersion (LBL_A)”转换为“myFile@@/main/myVersion”

【讨论】:

  • 呃,我错过了什么吗?问题是“任何其他标签”,您只是在明确测试 LBL_B。
  • @hlovdal 你是对的,并且已经重写了我的答案以实际回应 OP ;)
  • 也谢谢你——因为我需要版本,hlovdal的版本更适合我,而且fmtccase的链接也很有帮助!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-04-16
相关资源
最近更新 更多