ClearCase:Найти файлы, имеющие только одну конкретную метку и не более.

StackOverflow https://stackoverflow.com/questions/1037659

  •  10-07-2019
  •  | 
  •  

Вопрос

Я хотел бы найти в ClearCase файлы, помеченные определенной меткой, но не установлено никаких других ярлыков.

Например, если у меня есть файлы, помеченные следующим образом:

file1 LBL_A, LBL_B
file2 LBL_A

Я хотел бы иметь запрос, который дает мне только файл2, а не файл1.

Есть ли способ сделать это с помощью Cleartool find?Если это невозможно сделать с помощью одного запроса, я также буду рад любым идеям, как сделать это в несколько шагов (я буду вызывать Cleartool из Perl-скрипта, чтобы было легко сохранять списки файлов). временно и запускайте над ними дальнейшие команды).

Заранее большое спасибо!

Ян

Это было полезно?

Решение

Предполагая, что 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 использует их в качестве разделителя.

Другие советы

Вы можете сделать это напрямую, без необходимости использования канала:

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

ответ хловдаля иллюстрирует, что в этом случае вам придется найти больше элементов, чем вам нужно, а затем отфильтровать их (несмотря на все Функции поиска ClearCase).

Примечание:

 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 ' ` обеспечить один результат в строке.
  • -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"
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top