ClearCase:Найти файлы, имеющие только одну конкретную метку и не более.
Вопрос
Я хотел бы найти в 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"