Существует ли инструмент для анализа имен, который является частью официального пакета инструментов RPM?
У меня есть список имен файлов. Каждый является именем файла пакета RPM. У меня нет реальных пакетов, только имена файлов. Для каждого мне нужно извлечь имя пакета и версию ($ NAME и $ VERSION). Причина, по которой я нуждаюсь в этом, заключается в том, что я пишу скрипт, который затем проверяет, что "yum install $ VERSION" устанавливает $ VERSION. Это часть системы, которая создает пакеты и проверяет, правильно ли они загружены.
Список имен файлов выглядит так:
$ cat /tmp/packages.txt
/home/builder/packages/testing-dev/CentOS/6/x86_64/emacs-mercurial-2.8-3.el6.x86_64.rpm
/home/builder/packages/testing-dev/CentOS/6/x86_64/emacs-mercurial-el-2.8-3.el6.x86_64.rpm
/home/builder/packages/testing-dev/CentOS/6/x86_64/mercurial-2.8-3.el6.x86_64.rpm
/home/builder/packages/testing-dev/CentOS/6/x86_64/mercurial-hgk-2.8-3.el6.x86_64.rpm
/home/builder/packages/testing-dev/CentOS/6/x86_64/python-redis-2.8.0-2.el6.noarch.rpm
/home/builder/packages/testing-dev/CentOS/6/x86_64/redis-2.6.16-1.el6.1.x86_64.rpm
/home/builder/packages/testing-dev/CentOS/6/x86_64/sei_dnsmaster-1.0-99.el6.x86_64.rpm
Я нашел следующий код, который является функцией BASH, которая выполняет задачу:
function parse_rpm() { RPM=$1;B=${RPM##*/};B=${B%.rpm};A=${B##*.};B=${B%.*};R=${B##*-};B=${B%-*};V=${B##*-};B=${B%-*};N=$B;echo "$N $V $R $A"; }
for i in $(</tmp/packages.txt) ; do
parse_rpm $i
done
Оно работает. В основном. Есть несколько исключений:
$ parse_rpm CentOS/6/x86_64/sei_dnsmaster-1.0-99.el6.x86_64.rpm
sei_dnsmaster 1.0 99.el6 x86_64
Обратите внимание, что он не получил версию правильно (она должна быть 1.0-99)
Мне интересно (1) есть ли в пакете rpmdev инструмент, который делает это правильно. (2) Если нет, могу ли я использовать официальное регулярное выражение. (3) Что является эквивалентом Python этого регулярного выражения?
Заранее спасибо!
Ответы:
Вам не нужно делать ничего из этого; RPM имеет аргумент формата запроса, который позволит вам точно указать данные, которые вы хотите получить. Он даже будет выводиться без окончания строки, если вы не укажете их.
Например:
Полный список переменных, которые вы можете использовать, можно получить с помощью:
Обратите внимание, что в случае
RELEASE
вывода аналогично84.el6
нормальному и ожидаемому результату, поскольку именно так RPM-пакеты являются версионными, когда они упакованы в дистрибутив или для него.источник
$ rpm --queryformat "%{NAME} %{VERSION} %{RELEASE} %{ARCH}" -q CentOS/6/x86_64/sei_dnsmaster-1.0-84.el6.x86_64.rpm package CentOS/6/x86_64/sei_dnsmaster-1.0-84.el6.x86_64.rpm is not installed
libopenssl0_9_8-32bit-0.9.8j-0.26.1_0.50.1.x86_64.delta.rpm
Мне сказали, что официальный способ сделать то, что я ищу, в Python:
Я написал короткую программу на Python, которая делает то, что мне нужно. Я предложу скрипт для проекта rpmdev для включения.
источник
Я разработал регулярные выражения, которые соответствуют всем данным, с которыми я смог их протестировать. Я должен был использовать смесь жадных и не жадных спичек. Тем не менее, вот мои версии Perl и Python:
Perl:
Python:
Я бы предпочел иметь регулярное выражение из проекта RPM. Тот, который я изобрел выше, должен сделать сейчас.
источник
.*
если вы ДЕЙСТВИТЕЛЬНО не хотите соответствовать). Приятно видеть, что вы нашли сами!AdbeRdr9.5.5-1_i486linux_enu.rpm
), который нарушает ваш анализ регулярных выражений выше.В крайних случаях RMP-файлы могут иметь несколько прикольных имен, но обычно вы можете разделить NVR на дефисы. Подвох - это N (имя), часть NVR может содержать дефисы и подчеркивания, но V (версия) и R (выпуск) гарантированно не будут иметь никаких посторонних дефисов. Таким образом, вы можете начать с обрезки части VR, чтобы получить имя.
Опираясь на это, вы можете изолировать часть версии и выпуска.
Просто разделите дефис снова, чтобы выделить нужную вам часть. И, очевидно, очистить строки расширения файлов arch и rpm, что само собой разумеющееся. Просто дать вам представление о том, как к нему можно обратиться в bash.
источник
Используйте параметры -q --queryformat из rpm, как было сказано выше, если вы хотите сделать это для неустановленного пакета, вы можете указать rpm с помощью
-p
опции, например:например
дает мне
так что просто разделять имя файла неправильно!
так что обратите внимание , это не правильные детали оборотов, например,
1.fedora
на самом деле1.fc10
в об / мин.источник
Если вы знакомы с регулярными выражениями и / или Perl, это довольно просто.
или только регулярное выражение:
Если вы разделите это, то это:
[^\-]+
дефиса , хотя бы один символ: (сбежал, потому что дефис имеет особое значение в группах символов)[^\-]+?
([^\-]+?)
([^\-]+?)-
.rpm
):([^\-]+?)-(.*).rpm$
(доллар означает «конец строки»)m#([^\-]+?)-(.*).rpm$#
Выполнено ! Просто получите обе части в переменных
$1
и$2
Комментарий к первому однострочнику:
Я был в директории с большим количеством файлов оборотов в минуту, следовательно
ls
.perl -p
эквивалентно ;Это объясняет, что мне пришлось ввести пустую строку,
$_
чтобы избежать перл-печати строки после того, как я ее распаковал и распечатал на заказ. Обратите внимание, что я мог бы использовать замены, чтобы избежать этого маленького взлома.источник
module-init-tools-3.9-21.el6_4.x86_64.rpm
.ИМХО самый простой способ оболочки это:
То есть: переверните каждую строку, используя косую черту только первой части ( emanelif ), затем используя дефис, отрежьте все, кроме первых двух частей (т.е. оставьте позади ESAELER, включая emanelif eth fo tser и NOISREV ) и поверните обратную запись обратно.
С вашим примером файла:
Чтобы получить другие части упражнения на чтение вырезать (1) .
источник
Вы можете использовать
dnf info
. Вот пример сценария Bash для получения значений и установки в качестве переменной:Это даст результат, даже если пакет не установлен.
источник