it-swarm.cn

如何找到提供文件的包?

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

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

446
David Z

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

来自man dpkg

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

例:

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

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

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

413
Ressu

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

然而更友好的方式是使用 buntu Packages Search 网站。他们可以选择“搜索包的内容”以获取特定的文件名。

226
jbowtie

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

apt-file list packagename
43
ptman

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

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

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

17
moberley

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

enter image description here

实施例

enter image description here

13
A.B.

这是 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而无需搜索 https://packages.ubuntu.com/#search_contents

3
Bruno Bronosky

我试图追踪我的系统上安装了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$'
3
Alexx Roche

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

2
Rory