TL; DR
Trzecia próba faktycznie działa! Opuszczam pierwsze 2 próby, aby inni, którzy mogą spotkać się z tymi pytaniami i odpowiedziami w przyszłości, mają nadzieję uzyskać pewien wgląd w to, jak nietrywialny problem to parsowanie informacji o wersji RPM i określenie pochodzenia, który był pierwszy, drugi, itp.
Próba nr 1 (OP powiedział, że nie działa)
To polecenie posortuje dane wyjściowe i wyświetli je w kolejności wersji:
$ 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
DLACZEGO TO NIE DZIAŁA: Naiwna osoba pomyślałaby, że możesz użyć jakiegoś wariantu sort
polecenia do wykonania tego zadania, ale istnieje wystarczająca zmienność i niespójność w formatowaniu informacji o aktualnej wersji dla danego RPM, że to po prostu nie jest ' t do zadania.
Próba # 2 (OP powiedział, że nie działa)
$ rpm -q --last kernel | head -n 1 | cut -d' ' -f1
kernel-2.6.35.14-106.fc14
DLACZEGO TO NIE DZIAŁA: Miałem wielką nadzieję, że takie podejście przyniesie wyniki, których szukał PO, ale problemem z tym, jak zauważył @Joel w komentarzach, jest to, że --last
przełącznik po prostu zwraca wyniki posortowane według data zainstalowania RPM.
Próba # 3
Ten z pewnością wykona zadanie. Znalazłem zestaw narzędzi o nazwie RPM Development Tools. W tym pakiecie znajdują się 2 narzędzia, które umożliwią określenie, czy jedna wersja RPM jest nowsza czy starsza od innej.
Jeśli RPM nie jest jeszcze zainstalowany, możesz to zrobić w następujący sposób:
yum install rpmdevtools
Pierwsze przydatne narzędzie nazywa się rpmdev-vercmp
. To narzędzie może porównać 2 nazwy RPM i powiedzieć, która z nich jest nowsza. Na przykład:
$ 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
Po znalezieniu tego, wszystko było gotowe, aby napisać skrypt powłoki, ale potem zrozumiałem, człowieku, jestem leniwy, więc naciągnąłem jeszcze kilka minut i znalazłem inne narzędzie w pakiecie o nazwie rpmdev-sort
.
To narzędzie jest brudne. Możesz użyć tego w następujący sposób:
$ 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
Istnieje wiele narzędzi w RPM Development Tools, które mogą być warte poszukiwania innych, dlatego wymieniam je tutaj w celu późniejszego wykorzystania.
$ 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
Alternatywa dla # 3
Alternatywą, z której korzysta OP wymieniona w komentarzach, jest skorzystanie sort -V
. To stolica -V
. Nigdy nie słyszałem o tym przełączniku. Ze strony podręcznika sort
:
-V, --version-sort
natural sort of (version) numbers within text
Jak się okazuje, sort
zapewnia funkcję sortowania numerów wersji, dzięki czemu można również wykonać sortowanie w następujący sposób:
$ 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