Convenções de nomenclatura / tradução entre os pacotes dpkg e apt?

3

Eu tenho tentado descobrir o gerenciamento de pacotes no debian um pouco melhor.

Eu descobri que você pode listar todos os pacotes em seu sistema usando o comando "apt-cache pkgnames":

root@t500:/etc# apt-cache pkgnames | less
aspell-ca
libglobus-rls-client5
rkhunter
libmpich-shmem1.0gf
meep
libspring-webmvc-portlet-2.5-java
libindicate-doc
libjetty-extra-java
python-decoratortools
tree-ppuzzle
darkice
cutter-testing-framework-bin
aspell-bg
libsmpeg0
libpng12-dev

No entanto, quando eu tento procurar informações adicionais sobre os pacotes no dpkg, os mesmos nomes de pacotes não estão listados:

root@t500:/etc# dpkg-query -W meep
No packages found matching meep.

root@t500:/etc# dpkg-query -W darkice
No packages found matching darkice.

Eu tinha assumido que apt e dpkg eles usariam pelo menos os mesmos nomes de pacotes, não é esse o caso?

Existe uma maneira de descobrir o nome do dpkg de um pacote apt?

    
por some1 02.12.2013 / 22:24

2 respostas

3

É 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
    
por 02.12.2013 / 22:48
0

O problema é que você precisa estabelecer um 'padrão' (com aspas) em vez de apenas escrever o nome:

$ dpkg-query -W 'samba'
samba   
$ dpkg-query -W 'samba*'
samba   
samba-client    
samba-common    2:3.6.9-1ubuntu1.1
samba-common-bin    2:3.6.9-1ubuntu1.1
samba-tools 
samba4-clients  
samba4-common   

É por isso que nenhum pacote aparece:

$ dpkg-query -W 'rkhunter' 
rkhunter    1.4.0-2

Outras coisas que podem funcionar:

dpkg-query -W '*a'
dpkg-query -W 'a*b*'
dpkg-query -W '?a*'

etc.

Normal shell wildchars are allowed in package-name-pattern. Please note you will probably have to quote package-name-pattern to prevent the shell from performing filename expansion.

    
por 02.12.2013 / 22:38

Tags