9

I use apt-cache pkgname to retrieve the packages as

me@host:~$ apt-cache pkgnames | wc -l
62803

get 62803 results

but

me@host:~$ dpkg -l | wc -l
2336

What's the reasons which lead such a huge distinction. I presume that dpkg is super than apt.

  • 2
    Possible duplicate of dpkg-query vs apt-cache – Olorin Mar 12 at 6:46
  • @Olorin I voted to Leave this question Open. They're duplicates alright, but I want the direction of the duplication to be reversed and dpkg-query vs apt-cache to be closed as a duplicate of this question instead. – karel Mar 12 at 8:38
16

apt is for managing remote repositories, dpkg - for locally installed packages. They're related. apt is front end to dpkg. When you run apt-get install package it gets .deb file, and installs it via dpkg. So numbers differ because there's a lot of packages available, but only fraction is installed locally on your system.

apt-cache can show both installed and non-installed packages, because it queries the apt cache - listing of what is available in remote repositories ( that cache is what you get when you do apt-get update). For instance,

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


$ dpkg -l terminator
dpkg-query: no packages found matching terminator

Note that there is another tool which can query list of installed/removed local packages, and that's dpkg-query. For instance,

$ 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

As per dpkg manual

dpkg can also be used as a front-end to dpkg-deb(1) and dpkg-query(1). The list of supported actions can be found later on in the ACTIONS section. If any such action is encountered dpkg just runs dpkg-deb or dpkg-query with the parameters given to it, but no specific options are currently passed to them, to use any such option the back-ends need to be called directly.

As far as dpkg-query goes, it should be noted that this tool is focused on querying the database of installed packages, and can output information in particular format(-f option plus -W action). For instance,

$ 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
---

Interestingly enough, dpkg database maintains listing of packages that are selected for removal or were removed at some point. dpkg-query can also take glob pattern as an argument, and depending on presence of absence of it show only installed/configured packages or all packages.

2

dpkg -l shows your installed package versions (starting with ii), removed ones (rc), and some others (e.g. installed but not configured, see the manpage).

apt-cache pkgnames shows you all the available package names (but not versions of the same package) in the added repositories.

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.