我有一台 RHEL,在其中一台服务器上我安装了两个不同版本的相同 RPM 软件包。
[root ~]# rpm -qa | grep my-package-name
my-package-name-6.6.2-129.x86_64
my-package-name-7.0.2-1.x86_64
我想知道是否可以只接收旧的包名称?基本上我想完成这样的事情:
[root ~]# rpm -qa | grep my-package-name | get-the-oldest-package
我该怎么做?
答案1
我不太确定您如何设法安装同一软件包的两个版本,但这应该可以完成这项工作:
rpm -q --queryformat "%{VERSION} %{NAME}-%{VERSION}-%{RELEASE}.%{ARCH}\n" my-package-name | \
sort -V | \
awk 'NR==1 { print $2 }'
第一行在 RPM 数据库中查询 my-package-name,要求 RPM 以特定格式提供结果——VERSION 后跟默认的“rpm -qa”字段。它通过管道传送到sort -V
to(尝试)对版本号进行排序,然后通过管道传送到awk
仅打印第一行,剥离附加的 VERSION 字段,从而产生rpm -qa
默认输出。
这使得您可以安全地假设您正在具有-V
排序标志的 RHEL 系统上运行它。
答案2
我总是对依赖于解释版本字符串的程序感到偏执,因此作为杰夫解决方案的替代方案,您也可以这样做:
[root@jb87-workstation ~]# rpm -q kernel --queryformat "%{INSTALLTIME} %{NAME}-%{VERSION}-%{RELEASE}.%{ARCH}\n" | sort -n | head -1 | awk '{print $NF}'
kernel-4.8.13-300.fc25.x86_64
(替换kernel
您的包名称)
rpm -qa
本质上,通过执行相同的命令并在--queryformat
每行前面加上安装时的 Unix 时间戳(位于标签中)来打印完整的包名称%{INSTALLTIME}
。然后,它用于sort -n
对输出从最旧到最新进行排序,并仅获取输出的第一行并打印最后一列,这将是完整的包名称。
不过,杰夫的作品还不错。这可能更多是个人喜好的问题。
答案3
您可以使用 yum 降级软件包名称。有时新的软件包会出现错误。我确实降级到旧包。