如何找到提供文件的包?
足够简单的问题:是否有一些我可以使用的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的搜索结果:
你的意思是,哪个包而不是哪个应用程序。 该应用程序是您的包管理器,例如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 for
是ping
(已安装)的完整路径,并且只是未安装dig
的二进制名称。 这有助于我发现我需要安装dnsutils
而无需去搜索https://packages.ubuntu.com/#search_contents
您可能必须这样做的一个原因是,如果您正在编译已经有ubuntu软件包的软件,则可以运行apt-get build-dep $PACKAGENAME
。 这将安装编译$PACKAGENAME
所需的所有包。