Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/apache-spark/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
ClearCase:查找只有一个特定标签而不是更多的文件_Clearcase_Labels_Cleartool - Fatal编程技术网

ClearCase:查找只有一个特定标签而不是更多的文件

ClearCase:查找只有一个特定标签而不是更多的文件,clearcase,labels,cleartool,Clearcase,Labels,Cleartool,我想在ClearCase中查找带有特定标签但未设置任何其他标签的文件 例如,如果我有这样标记的文件: file1 LBL_A, LBL_B file2 LBL_A 我希望有一个查询,只给出file2而不是file1 有没有一种方法可以通过ClearToolFind实现这一点?如果一个查询不可能做到这一点,我也很乐意知道如何通过几个步骤做到这一点(我将从perl脚本调用cleartool,这样可以很容易地临时保存文件列表并对其运行进一步的命令) 提前多谢 Jan假设LBL_A是您想要运行的(唯一

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

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

file1 LBL_A, LBL_B
file2 LBL_A
我希望有一个查询,只给出file2而不是file1

有没有一种方法可以通过ClearToolFind实现这一点?如果一个查询不可能做到这一点,我也很乐意知道如何通过几个步骤做到这一点(我将从perl脚本调用cleartool,这样可以很容易地临时保存文件列表并对其运行进一步的命令)

提前多谢

Jan

假设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的/\(.*):(LBL\u A)/\1/p'
(假设文件名中没有冒号)

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

cleartool find ... -print | tr '\012' '\000' | xargs -0 cleartool ....
这将把换行符转换为ascii null,然后让xargs将其用作分隔符。

说明,在这种情况下,您必须找到比您需要的更多的元素,然后对它们进行过滤(尽管存在所有错误)

注:

可以直接向您提供元素(而不是本例中可能不感兴趣的版本)。您可以找到带有
-version
的版本和如下所述的格式指令

的帮助下,您可以定制输出,以精确获得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”。“
    \n”确保每行有一个结果
  • -version
    -fmt“%n%l\n”
    将显示版本
  • \“$CLEARCASE\u 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\u A)
    ”转换为“myFile@@@main/myVersion”

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

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

呃,我遗漏了什么吗?问题是“任何其他标签”,你只是在明确测试LBL_B。@hlovdal你是对的,并且已经重写了我的答案以实际响应OP;)也感谢你-因为我需要版本,hlovdal的版本更适合我,而且fmtccase的链接非常有用@你没有错过任何东西(像我一样)。我刚刚取消了否决票并重写了我的帖子:)@hlovdal我修复了我的帖子并提出了另一种(简单的)过滤结果的方法。因为你的帖子基本上是正确的:+1谢谢,这正是我需要的!刚刚更新了我的命令行以显示版本而不是元素有人验证了这是否有效吗?听起来比事后过滤cleartool输出更有效。当然,这种方法并不能完全回答这个问题,除非人们确切地知道可能出现什么标签。
cleartool find . -ver "lbtype(LBL_A) && !lbtype(LBL_B)" -print