ClearCase: поиск файлов, имеющих ровно одну конкретную метку и не более
Я хотел бы найти в ClearCase файлы, которые помечены определенной меткой, но не имеют других установленных меток.
Например, если у меня есть файлы, помеченные так:
file1 LBL_A, LBL_B
file2 LBL_A
Я хотел бы иметь запрос, который дает мне только file2, а не file1.
Есть ли способ сделать это с помощью cleartool find? Если это невозможно сделать с одним запросом, я также буду рад любым идеям, как сделать это в несколько шагов (я буду вызывать cleartool из сценария perl, поэтому будет легко сохранять списки файлов временно и запускать дальнейшие команды на них).
Заранее большое спасибо!
январь
3 ответа
Предполагая, что 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
Ответ hlovdal показывает, что в этом случае вам нужно найти больше элементов, чем вам нужно, и затем отфильтровать их (несмотря на все функции поиска 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 '
\ n` обеспечить один результат на строку.-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"