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

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

评论

我一直想知道这个问题-我知道您可以使用YUM来提供 / ,但是除了Packages网站之外,我从来没有在Aptitude中找到替代方案

在SU上相同:superuser.com/questions/10997/…

这里没有任何答案实际上涵盖了Provides:机制。更详细地说,任何软件包中都不包含像mailx或sendmail这样的命令作为二进制文件。相反,各种软件包安装了它们自己的二进制文件,然后通过/ etc / alternatives以“规范”名称提供其中一些二进制文件。另请参见askubuntu.com/questions/366135/…

#1 楼

您可以使用dpkg命令找出哪个已安装的软件包拥有文件:
man dpkg中:
-S, --search filename-search-pattern...
                  Search for a filename from installed packages.

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

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

评论


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

–陈丹妮(Taniel T Chen)
2010-11-23 21:29

提示:如果您不知道完整路径,而仅是命令名称,请使用它来查找程序:dpkg -S`哪个firefox`

– Lekensteyn
2011年6月7日15:38

@DanielTChen,但如果dlocate的数据库已过期,则dlocate可能无法完成该工作。您必须调用sudo update-dlocatedb进行更新。

– jarno
2015年6月14日14:40在

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

– Dan Dascalescu
16年1月21日,下午1:05

您也可以使用realpath来解析符号链接,如下所示:dpkg -S $(realpath $(which ))。

– LarsNyström
19年1月18日在14:24

#2 楼

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

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

sudo apt-get install apt-file


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

sudo apt-file update


最后搜索文件:

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


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

评论


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

–user2097818
16年4月1日在6:00

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

– David Z
18年4月3日在23:36

对于世界各地的Redhat来说-apt-file search <>是dnf / yum whatprovides <>的最接近的类似物。

–雏鸟
18年4月29日在20:14

我很早以前就把apt-file find别名为apt-find,这真的很方便!顺便说一句,最新版本需要root才能更新apt-file。

–val说恢复莫妮卡
19年6月2日在8:38

我猜想问题是,为什么世界上没有将此功能内置到apt,apt-get或其他默认apt- *程序之一中。这似乎是任何程序包管理器搜索功能的关键部分。

–theferrit32
2月3日,18:52



#3 楼

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

apt-file list packagename


#4 楼

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

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

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

评论


最近这只是返回一个错误。

– Pawel Veselov
19年5月7日在19:23

#5 楼

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



示例



评论


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

– ReyKev
15年11月29日在17:14



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

– ReyKev
15年11月29日在17:22

#6 楼

这是对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,因此导致了以下结果:对于未安装的Searching for。这帮助我发现我需要安装ping而不需要搜索https://packages.ubuntu.com/#search_contents

评论


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

– Alexx Roche
18年7月30日在11:49

#7 楼

我试图跟踪系统上安装了什么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,我喜欢这个答案。希望您不要介意我的编辑。我也使其适用于系统上未安装的文件。我在gist.github.com/RichardBronosky / ...上做了备份,如果您还原/拒绝它,它将创建我自己的答案。

–布鲁诺·布鲁诺斯基(Bruno Bronosky)
18年7月15日在5:00

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

–布鲁诺·布鲁诺斯基(Bruno Bronosky)
18年7月18日在5:47



随意编辑或修改;任何使您更满意的东西(这就是为什么我添加了MIT Licence!我什至不需要信誉。)

– Alexx Roche
18年7月30日在11:41

#8 楼

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

#9 楼

原因:
不同的发行版都有其自己的方式,太多的命令难以记住o(╥﹏╥)o
方法:
通用解决方案:pacapt -Qo file_path
结果:
在ubuntu上:
$ pacapt -Qo /usr/bin/iostat
sysstat: /usr/bin/iostat

在centos上:
$ pacapt -Qo /usr/bin/iostat
sysstat-10.1.5-19.el7.x86_64

甚至可以找到路径本身:
$ pacapt -Qo iostat
sysstat: /usr/share/man/man1/iostat.1.gz
sysstat: /usr/bin/cifsiostat
sysstat: /usr/bin/iostat
sysstat: /usr/share/man/man1/cifsiostat.1.gz

适应:

pacapt是许多软件包管理器的包装器

安装:
只需下载可移植脚本:
wget -O $HOME/bin/pacapt https://github.com/icy/pacapt/raw/ng/pacapt

评论


什么是“适应”?一个人怎么得到的?

– pomsky
10月14日上午11:40

@pomsky我已经更新了pacapt信息。您可以按照答案中的描述通过wget获得pacapt。

–秦寺
10月16日,下午1:45