TL; DR
3-я попытка действительно работает! Я оставляю первые две попытки, чтобы другие, которые могут столкнуться с этими вопросами и ответами в будущем, надеялись получить некоторое представление о том, насколько нетривиальной является проблема анализа информации о версии RPM и определения происхождения, который пришел первым, вторым, и т.п.
Попытка № 1 (OP сказал, что не работает)
Эта команда отсортирует выходные данные и выдаст их в порядке версий:
$ rpm -q kernel --queryformat "%{VERSION} %{RELEASE}\n"|sort -n
2.6.18 238.12.1.el5
2.6.18 238.19.1.el5
2.6.18 274.12.1.el5
2.6.18 308.8.2.el5
ПОЧЕМУ ЭТО НЕ РАБОТАЕТ: Наивный человек может подумать, что вы можете использовать какой-либо вариант sort
команды для выполнения этой задачи, но в форматировании фактической информации о версии для данного RPM достаточно вариативности и несоответствия, что это просто не так. Т до задачи.
Попытка № 2 (OP сказал, что не работает)
$ rpm -q --last kernel | head -n 1 | cut -d' ' -f1
kernel-2.6.35.14-106.fc14
ПОЧЕМУ ЭТО НЕ РАБОТАЕТ: я возлагал большие надежды на то, что этот подход даст результаты, которые ищет ОП, но проблема с этим, как указал @Joel в комментариях, заключается в том, что --last
переключатель просто возвращает результаты, отсортированные по дата установки RPM.
Попытка № 3
Этот определенно сделает работу. Я нашел набор инструментов под названием RPM Development Tools. В этом наборе есть 2 инструмента, которые дадут вам возможность определить, является ли одна версия RPM более новой или более старой, чем другая.
Если RPM еще не установлен, вы можете сделать это следующим образом:
yum install rpmdevtools
Первый полезный инструмент называется rpmdev-vercmp
. Этот инструмент может сравнить 2 имени RPM и сказать вам, какое из них более новое. Например:
$ rpmdev-vercmp kernel-2.6.35.14-100.fc14.x86_64 kernel-2.6.35.14-103.fc14.x86_64
0:kernel-2.6.35.14-103.fc14.x86_64 is newer
После того, как я нашел это, я был готов собрать сценарий оболочки, но потом понял, чувак, я ленивый, поэтому я потыкал еще несколько минут и нашел в комплекте другой инструмент под названием rpmdev-sort
.
Этот инструмент платный. Вы можете использовать его следующим образом:
$ rpm -q kernel | rpmdev-sort
kernel-2.6.35.14-100.fc14.x86_64
kernel-2.6.35.14-103.fc14.x86_64
kernel-2.6.35.14-106.fc14.x86_64
В инструментах разработки RPM есть много инструментов, на которые стоит обратить внимание другим, поэтому я перечислю их здесь для дальнейшего использования.
$ rpm -q --queryformat '[%{NAME} %{FILEMODES:perms} %{FILENAMES}\n]' rpmdevtools \
| grep -E "^.* -..x..x..x " \
| awk '{print $3}' \
| sed 's#/usr/bin/##' \
| paste - - - \
| column -t
annotate-output checkbashisms licensecheck
manpage-alert rpmargs rpmdev-bumpspec
rpmdev-checksig rpmdev-cksum rpmdev-diff
rpmdev-extract rpmdev-md5 rpmdev-newinit
rpmdev-newspec rpmdev-packager rpmdev-rmdevelrpms
rpmdev-setuptree rpmdev-sha1 rpmdev-sha224
rpmdev-sha256 rpmdev-sha384 rpmdev-sha512
rpmdev-sort rpmdev-sum rpmdev-vercmp
rpmdev-wipetree rpmelfsym rpmfile
rpminfo rpmls rpmpeek
rpmsodiff rpmsoname spectool
Альтернатива № 3
Альтернатива, которую ОП упоминает в комментариях, заключается в использовании sort -V
. Это столица -V
. Я никогда не слышал об этом переключателе либо. Со sort
страницы руководства :
-V, --version-sort
natural sort of (version) numbers within text
Оказывается, sort
есть возможность сортировки номеров версий, чтобы вы также могли выполнить сортировку следующим образом:
$ rpm -q kernel | sort -V
kernel-2.6.35.14-100.fc14.x86_64
kernel-2.6.35.14-103.fc14.x86_64
kernel-2.6.35.14-106.fc14.x86_64