【问题标题】:How do I find which rpm package supplies a file I'm looking for?如何找到哪个 rpm 包提供了我正在寻找的文件?
【发布时间】:2010-11-11 03:13:52
【问题描述】:

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

如何找出安装特定文件的软件包?我正在寻找我不一定已经在本地下载了可能包含我正在寻找的文件的包的位置。

我使用的是 CentOS 5。

【问题讨论】:

  • superuser.com___?
  • @Grzegorz 好点,我已经投了票。
  • 这里有一个更好的答案:unix.stackexchange.com/a/4706/39281
  • @SamWatkins 只有在提供您要查找的文件的软件包已安装在系统上时,该答案才有效。如果未安装软件包(如 OP 所说),则不能使用rpm,您需要使用yum

标签: centos rpm yum


【解决方案1】:

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

rpm -qf myfilename

【讨论】:

  • 这个命令看起来比 yum whatprovides 更有效——不需要从可能很慢的存储库获取更新。
  • 这个版本也适用于非基于 redhat 的发行版,仍然使用 rpm 的,例如 openSUSE
  • 在我看来 rpm -qf <filename> 最适合确定哪个软件包提供了已安装的应用程序(因为它可能与当前 yum 存储库缓存中的不同),而 yum whatprovides <filename> 是最好的适合确定哪个软件包提供了尚未安装的应用程序。每个人都有自己的目的。
  • 此外,yum whatprovides ... 仅在应用程序是根包(即它位于 /sbin 中)时才需要根。但是,rpm -qf ... 也需要 root 才能从 /sbin 读取 rpm。因此,我建议这两种方法的根本要求在功能上是等效的。
  • 任何使用此命令的人,请注意您必须使用完整的文件路径+文件名,而不仅仅是文件名。
【解决方案2】:

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

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

【讨论】:

  • 此网站离线!
  • 网站似乎没有搜索文件;仅包含搜索词的包名称。
  • @jww 搜索文件至少对我来说很好。正如文档所说,您可以通过单个路径名或具有绝对路径名的任何文件搜索可执行文件。
【解决方案3】:

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

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

【讨论】:

    【解决方案4】:

    当您连接到 Internet(存储库)时很容易找到该软件包,但是当您只能访问 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
    
    【解决方案5】:

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

    由于此搜索通常仅针对已安装软件包中的文件执行,因此通过禁用所有外部存储库(无法禁用隐式“已安装”存储库),yum whatprovides 变得非常快。

    yum --disablerepo=* whatprovides <file>
    

    【讨论】:

    • 然而,在这种情况下,OP 专门寻找系统上未安装的丢失文件,即使在安装了他认为会有的软件包之后也是如此,所以他不能使用--disablerepo=*
    【解决方案6】:

    您可以在此处以类似方式执行此操作,但需要使用您的包裹。就我而言,它是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 打包者可以选择最适合他的。

    【讨论】:

      【解决方案7】:

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

      rpm -q --whatprovides [file name]
      

      参考。 https://www.thegeekdiary.com/how-to-find-which-rpm-package-provides-a-specific-file-or-library-in-rhel-centos/

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-05-27
        • 1970-01-01
        • 2022-08-19
        • 2020-12-30
        • 1970-01-01
        • 2010-12-02
        • 2020-05-27
        相关资源
        最近更新 更多