Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/sorting/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Centos 如何查找提供文件I';我在找什么?_Centos_Rpm_Yum - Fatal编程技术网

Centos 如何查找提供文件I';我在找什么?

Centos 如何查找提供文件I';我在找什么?,centos,rpm,yum,Centos,Rpm,Yum,作为一个例子,我正在寻找一个mod_files.sh文件,它可能是php-devel包附带的。我猜yum会用php-devel x86_64 5.1.6-23.2.el5_3包安装mod_files.sh文件,但该文件似乎没有安装在我的文件系统上 如何确定哪个软件包安装了特定文件?我正在寻找我不一定已经在本地下载的包,其中可能包括我正在寻找的文件 我正在使用CentOS 5。了解拥有(或提供)已安装文件的软件包: rpm -qf myfilename 您可以转到并搜索该文件 您将获得许多不同发

作为一个例子,我正在寻找一个
mod_files.sh
文件,它可能是
php-devel
包附带的。我猜
yum
会用
php-devel x86_64 5.1.6-23.2.el5_3
包安装
mod_files.sh
文件,但该文件似乎没有安装在我的文件系统上

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


我正在使用CentOS 5。

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

rpm -qf myfilename
您可以转到并搜索该文件


您将获得许多不同发行版和版本的结果,但很可能还会弹出Fedora和/或CentOS,您将知道要使用yum安装的软件包名称这是一个老问题,但当前的答案不正确:)

使用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
可以执行其他查询,例如列出软件包内容、依赖项、反向依赖项等。

当您连接到internet(存储库)时,很容易找到软件包,但是当您只能访问Redhat或Centos DVD中的RPM软件包时(当我必须恢复服务器并且需要应用程序时,这种情况经常发生)我建议使用下面的命令,这些命令完全独立于internet和存储库(支持在DVD中安装大量卸载的软件包)。 假设您已在~/cent_os_dvd中装入软件包文件夹,并且正在寻找提供“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

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

由于此搜索通常只对已安装软件包中的文件执行,yum-whatprovides通过禁用所有外部repo(无法禁用隐式的“已安装”repo),速度非常快

yum--disablerepo=*whatprovides

在这里,你可以用你的软件包做同样的事情。在我的例子中,它是lsb_发行版

运行:
yum-whatprovides-lsb\u-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安装redhat lsb core


软件包名称不应包含数字和系统类型,以便yum-packager可以选择最适合自己的软件包。

仅使用rpm实用程序,这应适用于任何具有rpm的操作系统:

rpm -q --whatprovides [file name]

参考

superuser.com__?@Grzegorz好的一点,我投了一张赞成票。这里有一个更好的答案:@SamWatkins,只有在系统上已经安装了提供您要查找的文件的软件包的情况下,这个答案才会起作用。如果软件包没有安装(如OP所说)然后,您不能使用
rpm
,您需要使用
yum
。此网站处于脱机状态!该网站似乎不会搜索文件;只有带有搜索词的包名。@jww搜索文件至少对我来说可以行得通。正如文档所说,您可以通过其单一路径名或任何具有绝对路径名的文件来搜索可执行文件。@jwwme.this命令看起来比yum-whatprovides更高效——不需要从速度可能较慢的存储库获取更新。此版本也适用于仍然使用rpm的非redhat发行版,如openSUSEIt。在我看来,
rpm-qf
最适合确定哪个软件包提供已安装的应用程序(因为它可能不同于当前yum repository缓存中的内容),
yum whatprovides
最适合确定哪个包提供了尚未安装的应用程序。每个包都有自己的用途。此外,
yum whatprovides…
仅当应用程序是根包时才需要根(即,它位于
/sbin
)但是,
rpm-qf…
还需要root才能从
/sbin
读取rpm。因此,我建议这两种方法的root要求在功能上是等效的。任何使用此命令的人,请注意,您必须使用完整的文件路径+文件名,而不仅仅是文件名。但是,在这种情况下,OP是指定的Caly正在寻找一个未安装在系统上的丢失文件,即使在安装了一个他认为会有它的包之后,他也无法使用
--disablerepo=*
rpm -q --whatprovides [file name]