我想在ClearCase中找到标有特定标签的文件,但没有设置任何其他标签。
例如,如果我的文件标记为:
file1 LBL_A, LBL_B
file2 LBL_A
我想要一个只提供file2而不是file1的查询。
有没有办法用cleartool找到这个?如果单个查询无法做到这一点,我也很高兴有任何想法如何在几个步骤中执行此操作(我将从perl脚本调用cleartool,因此保存文件列表很容易暂时并在它们上运行更多命令。)
提前多多感谢!
扬
答案 0 :(得分:7)
假设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将其用作分隔符。
答案 1 :(得分:6)
您可以直接执行此操作而无需管道:
cleartool find . -ver "lbtype(LBL_A) && !lbtype(LBL_B)" -print
答案 2 :(得分:2)
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
:避免显示所有标签列表。无论如何,如果有多个,你就不感兴趣了!因此,要找到确切的版本:
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”