2009-06-24 9 views
5

Ich möchte Dateien in ClearCase finden, die mit einem bestimmten Etikett versehen sind, aber dass keine anderen Etiketten haben.ClearCase: Finden Sie Dateien mit genau einem bestimmten Label und nicht mehr

Zum Beispiel, wenn ich Dateien wie diese markiert haben:

file1 LBL_A, LBL_B 
file2 LBL_A 

Ich möchte eine Abfrage haben, die mich nur file2 und nicht file1 gibt.

Gibt es eine Möglichkeit, dies mit cleartool find zu tun? Wenn dies nicht mit einer einzigen Abfrage möglich ist, würde ich mich auch über einige Ideen freuen, wie dies in mehreren Schritten erledigt werden kann (ich werde cleartool von einem Perl-Skript aus aufrufen, so dass es einfach ist, Listen von Dateien zu speichern vorübergehend und führen Sie weitere Befehle auf ihnen).

Vielen Dank im Voraus!

Jan

+0

gerade aktualisiert meine Befehlszeilen Zeige Versionen statt Element – VonC

Antwort

6

Unter der Annahme, LBL_A die (nur) ist Label, das Sie

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

sollte

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

als Ausgabe, die Sie dann in Ihrem Perl-Skript überprüfen oder durch Filter sed -n 's/\(.*\): (LBL_A)/\1/p' (keine Doppelpunkte in Dateinamen vorausgesetzt).

Update: Wie VonC richtig ausgeführt hat, über den Befehl für Dateien mit Leerzeichen fehl, die ausgeführt werden, wie zu handhaben.

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

die Zeilenumbrüche in ascii übersetzen null und dann haben xargs verwenden, die als Trennzeichen.

+0

@hlovdal du hast nichts vermisst (wie ich). Ich habe gerade den Downvote abgebrochen und meinen Post umgeschrieben :) – VonC

+0

@hlovdal Ich fixiere meinen Beitrag und schlage einen anderen (einfachen) Weg vor, um das Ergebnis zu filtern. Da deine Postfolge im Wesentlichen richtig ist: +1 – VonC

+0

Danke, genau das brauche ich! – Jan

2

hlovdal's answer veranschaulicht, dass Sie in diesem Fall mehr Elemente finden müssen als Sie benötigen, und filtern Sie sie dann (trotz aller ClearCase find features).

Hinweis:

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

könnten Sie direkt die Elemente (und nicht die Version, die in diesem Fall nicht interessant sein kann). Sie können die Version mit -version und eine Format-Direktive wie unten beschrieben finden.

Mit Hilfe von fmt_ccase, können Sie die Ausgabe anpassen genau was Skript Ihre Perl bekommen auf gehen müssen:

cleartool find . -type f -element 'lbtype_sub(LBL_A)' -exec 'cleartool describe -fmt "%En %Cl\n" \"$CLEARCASE_XPN\"' | grep -v "," 
  • -fmt "%En %l\n" wird angezeigt, den vollständigen Pfad des Element (anstelle der Version:/a/b/myFile @@/main/myVersion) => /a/b/myFile'. the ' \ n` gewährleisten ein Ergebnis pro Zeile.
  • -version und -fmt "%n %l\n" würde die Version
  • \"$CLEARCASE_XPN\" anzuzeigen: die doppelten Anführungszeichen der erweiterte Pfad der Version arount gewährleisten mit Leerzeichen in seinem Namen wird noch arbeiten, um eine Datei gefunden.
  • grep -v ",": Wenn es irgendein Komma ist, bedeutet, dass „mehr als ein Etikett“
  • %Cl: vermeiden, dass die Etiketten alle Liste der Anzeigen. Wie auch immer, wenn es mehr als einen gibt, bist du nicht interessiert!

Also, für die genaue Version finden:

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

Hinweis:
Die oben genannten Arbeiten mit Unix-Syntax. Die Windows-Syntax wäre:

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

, die die Version der Dateien mit nur einer (richtig) Etikettenliste würde.

  • awk '{sub(/ \(.*/,"");print}' wird "[email protected]@/main/myVersion (LBL_A)" in "myFile @@/main/myversion" verwandeln
+0

Eh, habe ich etwas verpasst? Die Frage sagt "andere Labels", Sie testen LBL_B nur explizit. – hlovdal

+0

@hlovdal Sie sind richtig, und und haben meine Antwort neu geschrieben, um tatsächlich auf das OP zu antworten;) – VonC

+0

dank dir auch - weil ich die Version brauche, hlovdals Version passt mir besser, aber auch der Link zu fmtccase war sehr hilfreich ! – Jan

5

Sie können dies, ohne dass Rohr direkt tun:

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

Hat jemand nachgeprüft, ob das tatsächlich funktioniert? Klingt nach einer viel effizienteren Lösung, als die Cleartool-Ausgabe nachträglich zu filtern. Natürlich beantwortet diese Methode die Frage nicht genau, es sei denn, man weiß genau, welche Labels vorkommen können. – clacke