如何找到提供文件的软件包?


466

很简单的问题:给定系统上文件的路径后,是否可以使用一些shell命令(或GUI方法)告诉我将它放在哪个软件包中?假设文件确实来自软件包。

额外的问题:如果我的系统上没有安装该文件,该怎么办?例如,是否存在一个网站可以让我查找文件并查看提供了哪些软件包(如果有)的网站?


6
我一直想知道这个问题-我知道您可以通过YUM进行yum whatprovides <filepath> / <filename>的操作,但是除了Packages网站
Marco Ceppi


这里没有任何答案实际上涵盖了该Provides:机制。更详细地讲,任何包中都不包含类似mailxsendmail不包含二进制的命令。而是,各种软件包会安装自己的二进制文件,然后通过来以“规范”名称提供其中的一些二进制文件。另请参见askubuntu.com/questions/366135/…–/etc/alternatives
Tripleee

Answers:


438

您可以使用dpkg命令找出哪个已安装的软件包拥有一个文件:

来自man dpkg

-S,-搜索文件名-搜索模式...
                  从已安装的软件包中搜索文件名。

例:

$ dpkg -S /bin/ls
coreutils: /bin/ls

您可以使用完整路径或仅使用文件名进行搜索。

如果要搜索尚未在计算机上安装的文件,则可以使用Ubuntu软件包搜索


5
我强烈建议使用dlocate,它每天都会更新,以加快查找速度。
Daniel T Chen

20
提示:如果您不知道完整路径,而只是命令名,请使用它which来查找程序:dpkg -S `which firefox`
Lekensteyn 2011年

1
@DanielTChen,但dlocate如果dlocate的数据库已过时,则可能无法完成该工作。您必须致电sudo update-dlocatedb进行更新。
jarno 2015年

2
如果dpkg确切路径未返回任何内容(例如dpkg /usr/bin/java),请仅尝试执行文件的名称(例如dpkg java)。
Dan Dascalescu '16

2
您也可以使用realpath来解析符号链接,如下所示:dpkg -S $(realpath $(which <command>))
LarsNyström

236

apt-file命令可以从命令行为您执行此操作。从源代码构建软件包时,我经常使用它。对于由系统上已安装的软件包提供的文件,apt-cache则是另一种选择。

要安装apt-file,请执行以下操作:

sudo apt-get install apt-file

然后,您需要更新它的数据库:

apt-file update

最后,搜索文件:

$ apt-file find kwallet.h
kdelibs5-dev: /usr/include/kwallet.h
libkf5wallet-dev: /usr/include/KF5/KWallet/kwallet.h

但是,更友好的方法是使用Ubuntu软件包搜索网站。他们可以选择“搜索软件包的内容”以查找特定的文件名。


21
我认为这应该是公认的答案。但是针对Ubuntu软件包搜索,我可能会说这样简单的Shell程序极其友好且易于记忆(一旦您知道)。如果您使用dpkg,apt-get或aptitude作为标准工具,那么启动Chrome浏览互联网并没有什么好玩的!
user2097818 '16

3
@ user2097818这不是可接受的答案的原因是我的主要问题仅限于系统上的文件和已安装的软件包。apt-file通常会发现误报,即未安装的软件包。当然,这个答案对于“奖励问题”非常有用。
David Z

3
对于那些来自Redhat方面的人来说,- apt-file search <>是最接近的类似物dnf/yum whatprovides <>
ffledgling

我别名apt-file findapt-find很久以前,它是非常方便!顺便说一句,最新版本要求root为apt-file update
Val

43

还有一个apt-file,用于在未安装的软件包中查找文件。例如:

apt-file list packagename


13

您的意思是,哪个软件包而不是哪个应用程序。该应用程序是您的包管理器,例如Software Center

使用dpkg

dpkg -S /usr/lib/tracker/tracker-store
dpkg -S tracker-extract
dpkg -S tracker-miner-fs

% dpkg -S /usr/lib/tracker/tracker-store
tracker: /usr/lib/tracker/tracker-store

使用apt-file

apt-file search /usr/lib/tracker/tracker-store

或者也可以:

apt-file search --regex /tracker-extract$
apt-file search --regex /tracker-miner-fs$

% apt-file search /usr/lib/tracker/tracker-store
tracker: /usr/lib/tracker/tracker-store

在此处的“在线”部分Search the contents of packages

在此处输入图片说明

在此处输入图片说明


您的意思是,哪个软件包而不是哪个应用程序。该应用程序是您的程序包管理器,例如Software Center。好的。谢谢!:)
ReyKev 2015年

感谢您的所有帮助!这些建议都没有帮助我找到哪个软件包安装了此/这些应用程序。所有搜索只会返回“跟踪器”。我怀疑那是恩思的天篷。一英里长的EULA使我想起了我以前的Microsoft Windows发呆,对此我感到非常高兴,我不再参与其中。我看到昨天安装了Tracker,因此从根本上摆脱了它以及Enthoughts的Canopy,所有问题都得到了解决。我真的很感谢你的帮助。有这样的支持真是太好了。再次感谢!凯文
雷伊夫(

4

这是对Alexx Roche出色答案的扩展。我试图对该答案进行编辑,但遭到拒绝(尽管不是Alexx)


我试图跟踪which系统上安装了什么。经过一点工作,我创建了/usr/local/bin/apt-whatprovides

#!/bin/sh
#apt-whatprovides ver. 201801010101 Copyright alexx, MIT Licence
#rdfa:deps="[realpath,apt-file,grep,which,sh,echo]"

BINARY="$(realpath $(which $@) 2>/dev/null)"
[ -z "$BINARY" ] && BINARY="$@"
echo Searching for $BINARY
PACKAGE="$(apt-file search $BINARY|grep -E ":.*[^-.a-zA-Z0-9]${BINARY}$")"
echo "${PACKAGE}"

尽管对于大多数已安装的东西,您可以使用:

apt-file search $(realpath $(which THING)) | grep 'THING$'

对于未安装的事物,可以使用:

apt-file search THING | grep '/THING$'

apt-whatprovides脚本适用于系统上存在和不在系统上的文件。例如,我的系统缺少,dig但是有ping这样的结果:

pi@raspberrypi:~ $ apt-whatprovides ping
Searching for /bin/ping
inetutils-ping: /bin/ping
iputils-ping: /bin/ping

pi@raspberrypi:~ $ apt-whatprovides dig
Searching for dig
dnsutils: /usr/bin/dig
epic4: /usr/share/epic4/script/dig
epic4-help: /usr/share/epic4/help/8_Scripts/dig
knot-dnsutils: /usr/bin/dig

请注意,这Searching forping(已安装)的完整路径,而只是dig未安装的二进制名称。这帮助我发现我dnsutils无需进行搜索即可安装https://packages.ubuntu.com/#search_contents


这是一个很好的答案,我应该删除我的!
Alexx Roche

3

我试图跟踪which系统上安装了什么。经过一些工作,我创建了apt-whatprovides

#!/bin/sh
#apt-whatprovides ver. 201801010101 Copyright alexx, MIT Licence
#rdfa:deps="[realpath,apt-file,grep,which,sh,echo]"

BINARY=$(realpath $(which $@))
PACKAGE=$(apt-file search $BINARY|grep -E ":\s*${BINARY}$")
echo ${PACKAGE%:*}

虽然对于大多数事情您都可以使用

apt-file search $(realpath $(which THING))|grep 'THING$'

1
Alexx,我喜欢这个答案。希望您不要介意我的编辑。我也使其适用于系统上未安装的文件。我在gist.github.com/RichardBronosky / ...上做了备份,如果您还原/拒绝它,它将创建我自己的答案。
布鲁诺·布罗诺斯基

更新:复制面食此答案并对其进行细微更改感觉有些泥泞,但我的编辑被拒绝了。希望您觉得我在您的回答保持了完整性。
布鲁诺·布罗诺斯基

随意编辑或修改;任何对您更有利的东西(这就是为什么我添加了MIT许可证!我什至不需要信用。)
Alexx Roche

2

您可能必须执行此操作的原因之一是,如果正在编译已经有ubuntu软件包的软件,则可以运行apt-get build-dep $PACKAGENAME。这将安装您需要编译的所有软件包$PACKAGENAME

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.