如何“grep”rpm?

如何“grep”rpm?

查找 rpm 提供的文件很容易

dnf provides *bin/vim

或者

yum whatprovides *bin/vim

如果你安装了 rpm 或 yum..但假设我想知道确切文件的 rpm 内容。例如

grep -ril bin/vim v*
vim-9.0.1572-1.2.ppc64.rpm

太容易了

但我想知道包含 bin/sh 的确切包,怎么办?使用此命令返回也具有 bin/sh 依赖项的包。我想知道提供 bin/sh 作为文件的确切包。

grep -ril bin/sh v*
v4l-conf-3.107-2.10.ppc64.rpm
vacation-1.2.7.1-13.3.ppc64.rpm
vim-9.0.1572-1.2.ppc64.rpm
virt-what-1.25-1.2.ppc64.rpm
vpnc-0.5.3r550-3.12.ppc64.rpm
vsftpd-3.0.5-10.1.ppc64.rpm

答案1

rpm -qf会告诉你哪个包拥有一个文件。

例如

% rpm -qf /bin/sh
bash-4.2.46-35.el7_9.x86_64

% rpm -qf /bin/vim
vim-enhanced-7.4.629-8.el7_9.x86_64

如果未安装软件包,那么您可以使用rpm -qlp 以下命令查看内容:

% rpm -qlp binutils-2.27-44.base.el7.x86_64.rpm | head
/usr/bin/addr2line
/usr/bin/ar
/usr/bin/as
/usr/bin/c++filt
/usr/bin/dwp
/usr/bin/elfedit
/usr/bin/gprof
/usr/bin/ld
/usr/bin/ld.bfd
/usr/bin/ld.gold

由此可以很简单地创建一个目录中所有 rpm 内容的“索引”文件,然后只需 grep 该索引即可。

一个我脑海中浮现的例子:

% for a in *.rpm
do
  rpm -qlp "$a" | sed "s/^/$a:/"
done > index

% grep :/usr/bin/sh index
bash-4.2.46-34.el7.x86_64.rpm:/usr/bin/sh

注意我必须搜索 /usr/bin/sh 因为 /bin 是 /usr/bin 的符号链接

答案2

您的问题中的第一个命令及其任何变体都*bin/<file>准确地给出了您所要求的内容:

yum provides *bin/vim

yum provides /bin/vim

yum provides /usr/bin/vim

vim-enhanced-2:8.2.2637-20.el9_1.x86_64 : A version of the VIM editor which includes recent enhancements
Repo        : @System
Matched from:
Filename    : /usr/bin/vim

vim-enhanced-2:8.2.2637-20.el9_1.x86_64 : A version of the VIM editor which includes recent enhancements
Repo        : appstream
Matched from:
Filename    : /usr/bin/vim

yum可以换成dnf.无论是否安装,都会返回该包。

如果是实际安装的包中包含的文件:

rpm -qf /bin/sh
bash-5.1.8-6.el9_1.x86_64

rpm -qf /usr/bin/vim
vim-enhanced-8.2.2637-20.el9_1.x86_64

相关内容