如何找到提供文件的包?

Dav*_*d Z 601 package-management

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

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

Res*_*ssu 552

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

来自man dpkg

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

例子:

$ dpkg -S /bin/ls
coreutils: /bin/ls
Run Code Online (Sandbox Code Playgroud)

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

如果您希望搜索尚未安装在您的计算机上的文件,您可以使用Ubuntu Packages Search
apt-file如不同答案中所述。

  • 提示:如果您不知道完整路径,而只知道命令名称,请使用 `which` 来查找他的程序:`dpkg -S \`which firefox\`` (21认同)
  • 我强烈建议使用 dlocate,它每天更新以加快查找速度。 (6认同)
  • @DanielTChen,但是如果 dlocate 的数据库已过期,则“dlocate”可能无法完成这项工作。您必须调用“sudo update-d locatedb”来更新它。 (3认同)
  • 您还可以使用 `realpath` 来解析符号链接,例如:`dpkg -S $(realpath $(which <command>))`。 (3认同)
  • 如果`dpkg` 的确切路径没有返回任何东西(例如`dpkg /usr/bin/java`),则只尝试可执行文件的名称(例如`dpkg java`)。 (2认同)

jbo*_*tie 324

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

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

sudo apt-get install apt-file
Run Code Online (Sandbox Code Playgroud)

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

sudo apt-file update
Run Code Online (Sandbox Code Playgroud)

最后,搜索文件:

$ apt-file find kwallet.h
kdelibs5-dev: /usr/include/kwallet.h
libkf5wallet-dev: /usr/include/KF5/KWallet/kwallet.h
Run Code Online (Sandbox Code Playgroud)

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

  • 在我看来,这应该是公认的答案。但是为了回应 *Ubuntu Packages Search*,我可能会争辩说,这么简单的 shell 程序非常友好且易于记忆(一旦你知道了)。如果您使用 dpkg、apt-get 或 aptitude 作为您的标准工具,那么启动 Chrome 浏览互联网就没有什么友好的了! (29认同)
  • 对于那些来自 Redhat 世界的人来说 - `apt-file search <>` 是最接近于 `dnf/yum whatprovides <>` 的类比。 (4认同)
  • 我想问题是为什么这个功能没有内置到 `apt`、`apt-get` 或其他默认的 `apt-*` 程序之一中。它似乎是任何包管理器搜索功能的关键部分。 (4认同)
  • @ user2097818 这不是公认的答案的原因是我的主要问题仅限于系统上的文件和安装的软件包。`apt-file` 经常会发现误报,即未安装的软件包。当然,这个答案非常适合“奖金问题”。 (3认同)

小智 49

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

apt-file list packagename
Run Code Online (Sandbox Code Playgroud)


mob*_*ley 19

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

例如,以下是在focal (20.04) 中libnss3.so 的搜索结果:

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

  • 最近这只是返回一个错误。 (3认同)

A.B*_*.B. 14

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

使用dpkg

dpkg -S /usr/lib/tracker/tracker-store
dpkg -S tracker-extract
dpkg -S tracker-miner-fs
Run Code Online (Sandbox Code Playgroud)

例子

% dpkg -S /usr/lib/tracker/tracker-store
tracker: /usr/lib/tracker/tracker-store
Run Code Online (Sandbox Code Playgroud)

使用apt-file

apt-file search /usr/lib/tracker/tracker-store
Run Code Online (Sandbox Code Playgroud)

或者也可能:

apt-file search --regex /tracker-extract$
apt-file search --regex /tracker-miner-fs$
Run Code Online (Sandbox Code Playgroud)

例子

% apt-file search /usr/lib/tracker/tracker-store
tracker: /usr/lib/tracker/tracker-store
Run Code Online (Sandbox Code Playgroud)

或在线这里,在该部分Search the contents of packages

在此处输入图片说明

例子

在此处输入图片说明


Bru*_*sky 5

这是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}"
Run Code Online (Sandbox Code Playgroud)

虽然对于大多数已安装的东西,您可以只使用:

apt-file search $(realpath $(which THING)) | grep 'THING$'
Run Code Online (Sandbox Code Playgroud)

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

apt-file search THING | grep '/THING$'
Run Code Online (Sandbox Code Playgroud)

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
Run Code Online (Sandbox Code Playgroud)

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