如何找到提供文件的包?

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

奖金问题:如果它是我的系统上没有安装的文件怎么办? 比方说,有一个网站可以让我查找一个文件,看看有哪些软件包提供它?

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

来自man dpkg

 -S, -  search filename-search-pattern ...
                  从已安装的软件包中搜索文件名。

例:

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

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

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

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软件包搜索网站。 他们可以选择“搜索包的内容”以获取特定的文件名。

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

 apt-file list packagename 

您可以在Ubuntu软件包网站上搜索各种Ubuntu版本中包含的软件包的内容。 请在“ 搜索包的内容 ”标题下查找 。

例如,以下是lucid(10.04)中libnss3.so的搜索结果:

http://packages.ubuntu.com/search?searchon=contents&keywords=libnss3.so&mode=exactfilename&suite=lucid&arch=any

你的意思是,哪个包而不是哪个应用程序。 该应用程序是您的包管理器,例如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

在此处输入图像描述

在此处输入图像描述

我试图找出我系统上安装的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$' 

这是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$' 

对于未安装的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

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