apt-cache 和 dpkg -l 的区别

Ali*_*ice 10 package-management apt dpkg

我使用 apt-cache pkgname 来检索包

me@host:~$ apt-cache pkgnames | wc -l
62803
Run Code Online (Sandbox Code Playgroud)

得到 62803 个结果

me@host:~$ dpkg -l | wc -l
2336
Run Code Online (Sandbox Code Playgroud)

导致如此巨大差异的原因是什么。我认为 dpkg 比 apt 好。

Ser*_*nyy 16

apt用于管理远程存储库,dpkg- 用于本地安装的软件包。他们有关系。apt是前端到dpkg. 当您运行apt-get install package它时.deb,它会获取文件,并通过dpkg. 所以数字有所不同,因为有很多可用的软件包,但只有一小部分安装在您的系统本地。

apt-cache可以显示已安装和未安装的软件包,因为它查询apt缓存 - 远程存储库中可用内容的列表(该缓存是您在执行时获得的内容apt-get update)。例如,

$ apt-cache policy terminator
terminator:
  Installed: (none)
  Candidate: 1.91-1


$ dpkg -l terminator
dpkg-query: no packages found matching terminator
Run Code Online (Sandbox Code Playgroud)

请注意,还有另一个工具可以查询已安装/删除的本地软件包列表,那就是dpkg-query. 例如,

$ dpkg-query -l 'libc6'
Desired=Unknown/Install/Remove/Purge/Hold
| Status=Not/Inst/Conf-files/Unpacked/halF-conf/Half-inst/trig-aWait/Trig-pend
|/ Err?=(none)/Reinst-required (Status,Err: uppercase=bad)
||/ Name                 Version         Architecture    Description
+++-====================-===============-===============-=============================================
ii  libc6:amd64          2.27-3          amd64           GNU C Library: Shared libraries
ii  libc6:i386           2.27-3          i386            GNU C Library: Shared libraries

$ dpkg -l libc6
Desired=Unknown/Install/Remove/Purge/Hold
| Status=Not/Inst/Conf-files/Unpacked/halF-conf/Half-inst/trig-aWait/Trig-pend
|/ Err?=(none)/Reinst-required (Status,Err: uppercase=bad)
||/ Name                 Version         Architecture    Description
+++-====================-===============-===============-=============================================
ii  libc6:amd64          2.27-3          amd64           GNU C Library: Shared libraries
ii  libc6:i386           2.27-3          i386            GNU C Library: Shared libraries
Run Code Online (Sandbox Code Playgroud)

根据dpkg 手册

dpkg 也可以用作 dpkg-deb(1) 和 dpkg-query(1) 的前端。稍后可以在 ACTIONS 部分中找到支持的操作列表。如果遇到任何此类操作,dpkg 只会使用给定的参数运行 dpkg-deb 或 dpkg-query,但当前未将特定选项传递给它们,要使用任何此类选项,需要直接调用后端。

说到这里dpkg-query,需要注意的是,这个工具主要是查询已安装包的数据库,可以输出特定格式的信息(-f选项加-W动作)。例如,

$ dpkg-query -W -f='PACK:${Package}\nARCH:${Architecture}\nSTAT:${Status}\n---\n' libc6
PACK:libc6
ARCH:amd64
STAT:install ok installed
---
PACK:libc6
ARCH:i386
STAT:install ok installed
---
Run Code Online (Sandbox Code Playgroud)

有趣的是,dpkg 数据库维护选择删除在某个时候删除的软件包列表。dpkg-query也可以将 glob 模式作为参数,并根据它是否存在只显示已安装/配置的包或所有包。