如何find哪个rpm包提供我正在寻找的文件?

作为一个例子,我正在寻找一个mod_files.sh文件,这个文件可能是用php-devel包来的。 我猜yum会安装mod_files.sh文件和php-devel x86_64 5.1.6-23.2.el5_3软件包,但该文件看起来并没有安装在我的文件系统上。

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

我正在使用CentOS 5。

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

使用yum whatprovides ,用你想要的文件的绝对path(可能是通配符)。 例如:

 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 

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

 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可以进行其他查询,如列出包内容,依赖关系,反向依赖关系等。

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

 rpm -qf myfilename 

注意:这个命令不需要以root身份运行(相反, sudo yum whatprovides myfilename

最stream行的答案是不完整的:

由于这个search通常只对来自安装包的文件执行, 因此通过禁用所有外部回购(隐式的“已安装”回购不能被禁用),使得提供的东西快速增长。

 yum --disablerepo=* whatprovides <file> 

当你连接到互联网(存储库)时,find软件包很容易,但是当你只能访问Redhat或Centos DVD中的RPM软件包时(这经常发生在我需要恢复服务器的时候,我需要一个应用程序)使用以下完全独立于互联网和存储库的命令。 (假设你有很多在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 

你去http://www.rpmfind.netsearch文件。;

你会得到很多不同的发行版和版本的结果,但很可能Fedora和/或CentOS也会popup,你会知道要用yum安装的包名