É o mesmo nome, apt
é apenas um frontend para dpkg
. A questão aqui é que os comandos não fazem o que você faz. Conforme explicado em man apt-cache
:
pkgnames [prefix]
This command prints the name of each package APT knows. The
optional argument is a prefix match to filter the name list. The
output is suitable for use in a shell tab complete function and the
output is generated extremely quickly. This command is best used
with the --generate option.
Note that a package which APT knows of is not necessarily available
to download, installable or installed, e.g. virtual packages are
also listed in the generated list.
Portanto, apt-cache pkgnames
lista todos os pacotes disponíveis para o sistema, independentemente de esses pacotes estarem instalados ou não.
Se você quiser listar apenas pacotes instalados, use dpkg -l
ou dpkg-query -l
:
-l, --list [package-name-pattern...]
List packages matching given pattern. If no package-name-pattern
is given, list all packages in /var/lib/dpkg/status, excluding
the ones marked as not-installed (i.e. those which have been
previously purged).
Isso significa que ele também listará os pacotes que foram removidos se seus arquivos de configuração ainda estiverem presentes, ou seja, se eles não tiverem sido removidos. A segunda coluna da saída dpkg-query -l
é o status do pacote, que pode ser qualquer um dos
Package status:
n = Not-installed
c = Config-files
H = Half-installed
U = Unpacked
F = Half-configured
W = Triggers-awaiting
t = Triggers-pending
i = Installed
Portanto, para encontrar esses pacotes atualmente instalados, você desejará selecionar aqueles cujo status seja i
. Para fazer isso, simplesmente grep
para linhas cujo primeiro caractere é qualquer coisa e cujo segundo é i
:
dpkg-query -l | grep '^.i'
Você pode verificar facilmente se os dois comandos são diferentes e se apt-cache
retorna milhares de resultados a mais do que dpkg
. Por exemplo, no meu sistema:
$ dpkg-query -l | grep '^.i' | wc -l
3938
$ apt-cache pkgnames | wc -l
39889