如何找到哪个rpm软件包提供了我要查找的文件?


207

举例来说,我正在寻找一个mod_files.sh可能随php-devel包装一起提供的文件。我猜想这yummod_files.shphp-devel x86_64 5.1.6-23.2.el5_3软件包一起安装文件,但是该文件似乎没有安装在我的文件系统上。

如何找出哪个软件包安装了特定文件?我正在寻找我不一定已经在本地下载该软件包的地方,其中可能包括我要寻找的文件。

我正在使用CentOS 5。


7
superuser.com ___?
Grzegorz Oledzki 2010年

@Grzegorz好点,我已投了赞成票。
rjh


1
@SamWatkins答案只有在系统上已安装了提供您要查找的文件的软件包时才起作用。如果未安装软件包(如OP所述),则无法使用rpm,需要使用yum
rjh

Answers:


266

这是一个老问题,但是当前答案不正确:)

使用yum whatprovides,并使用所需文件的绝对路径(可以通配)。例如:

yum whatprovides '*bin/grep'

退货

grep-2.5.1-55.el5.x86_64 : The GNU versions of grep pattern matching utilities.
Repo        : base
Matched from:
Filename    : /bin/grep

您可能更喜欢软件包中repoquery提供的工具的输出和速度yum-utils

sudo yum install yum-utils
repoquery --whatprovides '*bin/grep'
grep-0:2.5.1-55.el5.x86_64
grep-0:2.5.1-55.el5.x86_64

repoquery 可以执行其他查询,例如列出程序包内容,依赖性,反向依赖性等。


199

要了解拥有(或提供)已安装文件的软件包:

rpm -qf myfilename

4
该命令看起来比yum提供的命令更有效-无需从可能较慢的存储库中获取更新。
2014年

此版本还可在仍使用rpm的非基于Redhat的发行版上使用,例如openSUSE
simotek

5
在我看来,rpm -qf <filename>最适合确定哪个软件包提供了已安装的应用程序(因为它可能与当前yum存储库缓存中的软件包有所不同),并且yum whatprovides <filename>最适合确定哪个软件包提供了尚未安装的软件包应用。每个人都有自己的目的。
B

此外,yum whatprovides ...仅当应用程序是根软件包(即,驻留在中/sbin)时才需要root 。但是,rpm -qf ...还需要root才能从读取rpm /sbin。因此,我建议这两种方法的根本要求在功能上是等效的。
–StockB

1
使用此命令的任何人,请注意,您必须使用完整的文件路径+文件名,而不仅仅是文件名。
Ashish '18年

31

最受欢迎的答案是不完整的:

由于通常只对已安装程序包中的文件执行此搜索,因此通过禁用所有外部存储库(无法禁用隐式的“已安装”存储库)可以使yum whatprovides变得异常快速。

yum --disablerepo=* whatprovides <file>

4
但是,在这种情况下,OP会特别寻找系统上未安装的丢失文件,即使在安装了他认为可以安装的软件包之后,他也无法使用--disablerepo=*
Randall

4

您转到http://www.rpmfind.net并搜索文件。

您将获得许多不同发行版和版本的结果,但是很有可能也会弹出Fedora和/或CentOS,并且您会知道要与yum一起安装的软件包名称。


这个网站是离线!
彼得

1
该网站似乎没有搜索文件;仅包含搜索词的软件包名称。
jww 2015年

1
@jww搜索文件至少对我有用。如文档所述,您可以通过可执行文件的单一路径名或具有绝对路径名的任何文件来搜索可执行文件。
2015年

4

当您连接到互联网(存储库)时,找到软件包很容易,但是当您只能访问Redhat或Centos DVD中的RPM软件包时(当我必须恢复服务器并且需要一个应用程序时,这种情况经常发生在我身上)使用以下完全独立于Internet和存储库的命令。(可能您的DVD中有很多已卸载的软件包)。假设您已经在〜/ cent_os_dvd中安装了Package文件夹,并且正在寻找一个提供“ semanage”的软件包,那么您可以运行:

for file in `find ~/cent_os_dvd/ -iname '*.rpm'`;  do rpm -qlp $file |grep '.*bin/semanage';  if [ $? -eq 0 ]; then echo "is in";echo $file  ; fi;  done


0

您可以在此处使用您的软件包,同样地进行操作。就我而言,lsb_release

跑: yum whatprovides lsb_release

响应:

redhat-lsb-core-4.1-24.el7.i686 : LSB Core module support
Repo        : rhel-7-server-rpms
Matched from:
Filename    : /usr/bin/lsb_release

redhat-lsb-core-4.1-24.el7.x86_64 : LSB Core module support
Repo        : rhel-7-server-rpms
Matched from:
Filename    : /usr/bin/lsb_release

redhat-lsb-core-4.1-27.el7.i686 : LSB Core module support
Repo        : rhel-7-server-rpms
Matched from:
Filename    : /usr/bin/lsb_release

redhat-lsb-core-4.1-27.el7.x86_64 : LSB Core module support
Repo        : rhel-7-server-rpms
Matched from:
Filename    : /usr/bin/lsb_release`

运行安装: yum install redhat-lsb-core

软件包名称应该没有数字和系统类型,以便yum打包程序可以选择最适合他的软件包。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.