2009-06-24 15 views
5

ClearCaseで特定のラベルでラベル付けされたファイルがありますが、には他のラベルはありません。があります。例えばClearCase:正確に1つの特定のラベルしか持たないファイルを検索します。

、私はこのようなラベルされたファイルがある場合:

file1 LBL_A, LBL_B 
file2 LBL_A 

を私は私にだけFILE2なくFILE1与えクエリを持っているしたいと思います。

cleartool findでこれを行う方法はありますか?これを単一のクエリで行うことができない場合は、私はいくつかのステップでこれを行う方法についても喜んでいます(perlスクリプトからcleartoolを呼び出すので、ファイルのリストを簡単に保存できます一時的にそれらのコマンドを実行してください)。

ありがとうございます!

+0

だけ更新私のコマンドラインに要素の代わりにバージョンを表示する – VonC

答えて

6

LBL_Aはあなたが、あなたのperlスクリプトで確認するかによってフィルタリングすることができ、出力として

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

を与える必要があります

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

を実行したい(のみ)のラベルであると仮定すると、 sed -n 's/\(.*\): (LBL_A)/\1/p'(ファイル名にコロンがないと仮定します)。

更新:VonCが正しく指摘するように、上記のコマンドは、内のスペースを持つファイルを失敗するように、その実行を処理するために:nullのアスキーに改行を変換して、xargsコマンドは、などということに使用されますどの

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

デリミタ。

+0

@hlovdalあなたは何も見逃さなかった(私のように)。私はちょうどdownvoteをキャンセルし、私の投稿を書き直します:) – VonC

+0

@hlovdal私は自分の投稿を修正し、結果をフィルタリングする別の(簡単な)方法を提案します。あなたの投稿のフォローは本質的に正しいので、+1 – VonC

+0

ありがとう、それは私が必要とするものです! – Jan

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行ごとに1つの結果が得られます。
  • -version-fmt "%n %l\n"はバージョン
  • \"$CLEARCASE_XPN\"を表示していました:二重引用符は、バージョンの拡張のパスがまだ動作します、その名前にスペースを持つファイルを確実に見つけarount。
  • 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の構文で
上記作品。窓の構文は次のようになります。一つだけ(正しい)のラベルが付いたファイルのバージョンをリストし

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 @@ /メイン/ myVersion" に "[email protected]@/main/myVersion (LBL_A)" を変えていく
+0

私は何かが恋しいですか?問題は "他のラベル"といい、LBL_Bを明示的にテストしているだけです。 – hlovdal

+0

@hlovdalあなたは正しいです、そしてOPに実際に応答するために私の答えを書き直しました;) – VonC

+0

あなたにも感謝しています - 私はバージョンが必要なので、hlovdalのバージョンは私に良く合いますが、fmtccaseのリンクも非常に役に立ちました! – Jan

5

あなたは直接パイプにせずにこれを行うことができます。

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

これは実際に動作するかどうかを誰か確認しましたか?事実の後にcleartoolの出力をフィルタリングするよりもはるかに効率的な解決策のように聞こえる。もちろん、この方法では、どのラベルが生成されるかを正確に知っていない限り、質問に正確に答えることはできません。 – clacke

関連する問題