如何找到提供文件的包?

379

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

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

    
David Z 30.07.2010 - 10:10

8 答案

356

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

来自 man dpkg

-S, --search filename-search-pattern...
                  Search for a filename from installed packages.

示例:

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

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

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

    
给出答案 Ressu 30.07.2010 - 10:42
187

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

    
给出答案 jbowtie 11.08.2010 - 04:43
35

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

apt-file list packagename
    
给出答案 ptman 30.07.2010 - 10:49
16

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

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

链接

    
给出答案 moberley 11.08.2010 - 04:42
10

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

部分。

实施例

    
给出答案 A.B. 29.11.2015 - 16:57
2

我试图追踪我系统上安装 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 [email protected]))
PACKAGE=$(apt-file search $BINARY|grep -E ":\s*${BINARY}$")
echo ${PACKAGE%:*}

虽然对于大多数人来说,你可以使用

apt-file search $(realpath $(which THING))|grep 'THING$'
    
给出答案 Alexx Roche 17.03.2018 - 16:25
2

这是 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 [email protected]) 2>/dev/null)"
[ -z "$BINARY" ] && BINARY="[email protected]"
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 ,所以这就是结果:

[email protected]:~ $ apt-whatprovides ping
Searching for /bin/ping
inetutils-ping: /bin/ping
iputils-ping: /bin/ping

[email protected]:~ $ 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 而无需搜索链接

    
给出答案 Bruno Bronosky 18.07.2018 - 07:45
1

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

    
给出答案 Rory 11.08.2010 - 21:31

阅读有关标签的其他问题