Encontre pacotes instalados a partir de um determinado repositório com o aptitude

Respostas:

17

Usando o aptitude, para procurar pacotes instalados fora do ramo stable, você pode usar:

aptitude search "?narrow(?installed,?not(?archive(stable)))"

Para ver versões e nomes de pacotes (e não descrições), você pode usar o comando com a opção de formato ( -Fpara abreviar), como a seguir.

aptitude search -F "%p %V %v" "?narrow(?installed,?not(?archive(stable)))"

Para mais formatos, consulte a página de manual (aqui está a documentação com as opções disponíveis ).

Isso funciona, por exemplo, no Debian, se você instalou pacotes fora do Squeeze (executando, por exemplo apt-get install -t sid package-name,.

Você pode ver de onde vem um pacote instalado apt-cache policy, o uso é o seguinte:

apt-cache policy <package-name>

Por exemplo, meu pacote python-numpy renderiza a seguinte saída:

$ LANG=C apt-cache policy python-numpy
python-numpy:
  Installed: 1:1.6.2-1
  Candidate: 1:1.6.2-1.2
  Version table:
     1:1.7.0-1 0
          1 http://ftp.es.debian.org/debian/ experimental/main amd64 Packages
     1:1.6.2-1.2 0
        500 http://ftp.es.debian.org/debian/ sid/main amd64 Packages
 *** 1:1.6.2-1 0
        100 /var/lib/dpkg/status
     1:1.4.1-5 0
        990 http://ftp.es.debian.org/debian/ squeeze/main amd64 Packages
        990 http://ftp.de.debian.org/debian/ squeeze/main amd64 Packages

Isso significa que eu sou uma versão atrás da ramificação atual do sid / main, então eu tenho uma versão antiga do sid instalada. Vejo que não tenho o estável porque ainda é 1.4.1-5, e atualmente estou 1.6.2-1.

No momento da submissão, este pacote já estava atualizado:)

ssice
fonte
Eu prefiro ?any-version(), porque ~narrow(pat1, pat2)é o mesmo ?any-version(pat1 pat2)e suporta ?any-version(pat1 pat2 pat3)sem parecer estúpido.
Robert Siemer
18

Depois de ler a página de informações do aptitude e uma dúzia de tentativas, finalmente consegui o seguinte:

aptitude search '?narrow(?installed,?not(?archive(testing)) ?archive(unstable))'

ou equivalente) :

aptitude search '~S ~i (!~Atesting ~Aunstable)'

Ele pesquisará pacotes instalados a partir de arquivos instáveis ​​de qualquer repositório. Você precisa filtrar os pacotes do seu arquivo padrão (testando no exemplo acima).

Se você deseja filtrar os pacotes instalados em www.debian-multimedia.org/unstable:

aptitude search '~S ~i (!~Atesting ~Aunstable ?origin("Unofficial Multimedia Packages"))

Edit: “Archive”, “origin” etc. são deduzidos do Releasearquivo do repositório. Infelizmente, nem todas as ferramentas podem examinar todas essas linhas e usam sintaxe diferente para elas. Você pode encontrar esses arquivos como /var/lib/apt/lists/*Release. Ou apenas digite apt-cache policypara obter uma visão geral. O apt-cache mudou seu formato de saída: versões posteriores usam o estilo apt_preferences.

  • Suite:ou Archive:(nome antigo!)
    • pesquisa de aptidão: ?archive(___)ou~A___
    • formato de aptidão: %t
    • apt_preferences: release a=___
    • Ubuntu exemplos: natty-backports, trusty-security,stable
  • Origin:
    • pesquisa de aptidão: ?origin(___)ou~O___
    • formato de aptidão: n / a
    • apt_preferences: release o=___
    • Exemplos Ubuntu: Canonical, Google, Inc., LP-PPA-dockbar-main,Ubuntu
  • todas as outras linhas
    • aptidão: n / a
Christophe
fonte
15

Examine a tag de origem (como o = Debian ) para cada um de seus repositórios atuais:

apt-cache policy | sed -n 's/.*o=\([^,]\+\).*/\1/p' | uniq

Em seguida, procure pacotes de (ou não de) uma origem específica:

aptitude search "?installed?origin(Debian)"
aptitude search "?installed?not(?origin(Debian))"

Isso não é adequado para uma auditoria de segurança, pois depende de cada repositório para fornecer suas próprias informações de origem, mas pode ser útil para solucionar problemas na origem de pacotes que estão presentes em vários repositórios.

Anônimo
fonte
2
Seus aptitude searchpadrões não são bons. - Eles selecionam assim "listar pacotes onde uma versão está instalada e qualquer outra versão existir no Debian" ou "alguma versão instalada e pelo menos uma versão desse pacote disponível no não-Debian". - O que procuramos é "a versão instalada é do Debian (ou não)". Isso tem que ser feito com ?narrow()ou ?any-version().
Robert Siemer 26/01
Confirmado. Eu instalei a nemo-filerollerpartir de linuxmint, mas ele existe Debiantambém. Então ele aparece na lista, porque está instalado e existe em algum lugar do Debian.
Boldewyn
6

Para completar: Nos sistemas Ubuntu, você também pode usar o Synaptic para esta tarefa. Na coluna da esquerda, você pode filtrar os pacotes por sua origem.

Boldewyn
fonte
Eu estava tentando fazer isso e encontrei este post no Google via SU, não acredito que esqueci o Synaptic, obrigado!
David Claridge
@RobertSiemer Pode ter escapado sua atenção, porque eu a aceitei após dois dias sem resposta suficiente e antes de qualquer outra resposta aparecer. Aceitei, porque resolveu o meu problema. Também votei em todas as respostas posteriores , mas, peço desculpas, nunca mudei o estado de aceitação. Você também observará nas perguntas frequentes deste site que não obtive nenhum ganho de reputação com essa mudança, na verdade perdi dois representantes por não aceitar a resposta de outra pessoa . Portanto, dê um passo atrás no futuro antes de julgar as decisões de alguém em público e repensar as possíveis causas.
precisa saber é o seguinte
2

Eu encontrei isso:

aptitude search "?origin (<repository>) ?installed"

Você também pode encontrar uma lista de termos de pesquisa suportados por "aptitude search" aqui .

max
fonte
Por que você precisa executar isso sudo? Parece-me que isso também funciona sem executá-lo como root.
Andre Holzner
Não precisa ser executado com o sudo #
Kurtis Nusbaum
Como comentei na resposta @Anonymous, isso não tem o efeito desejado.
Robert Siemer
2

Primeiro, encontre o (s) arquivo (s) apropriado (s) para o repositório de interesse em / var / lib / apt / lists. Deveria ser possível fazer isso programaticamente, mas não precisei fazer isso.

Usando o google chrome como exemplo, tente o seguinte:

SEARCH_PATTERN=dl.google.com_linux_chrome  # adjust to suit your needs

for PKG in $( grep-dctrl -sPackage . /var/lib/apt/lists/${SEARCH_PATTERN}_*_Packages | sed 's/^Package: //' )
do
    if dpkg -s "${PKG}" 2> /dev/null 1> /dev/null
    then
        echo ${PKG}
    fi
done

e eu recebo a saída:

google-chrome-stable

O dpkg -s retorna 0 se o pacote estiver instalado e diferente de zero. Para fins de referência futura, a saída de

grep-dctrl -sPackage . /var/lib/apt/lists/${SEARCH_PATTERN}_*_Packages

estava

Package: google-chrome-beta
Package: google-chrome-stable
Package: google-chrome-unstable
coreyh
fonte
... isso usa o aptitude?
Robert Siemer
2
@RobertSiemer Como isso é relevante? A questão, assumindo um domínio razoável do inglês, é como encontrar a fonte dos pacotes que foram instalados com o aptitude . Não é necessário que a solução use o aptitude.
Auspex
@ Auspex, acredito em contrário. - E não se preocupe, meu domínio do inglês superou o "razoável" alguns anos atrás.
Robert Siemer
2
Aparentemente, não ...
Auspex
2
@Auspex: você está tentando me provocar? O oposto é verdadeiro: a questão é pedir uma solução baseada no aptitude, não pacotes instalados com o aptitude.
Robert Siemer
0

As outras respostas estão realmente incorretas, porque o parâmetro para ?archive()é uma expressão regular. Então ?archive(stable)combina ambos stablee unstable. Para excluir apenas stablevocê precisa ancorar o padrão regex:

aptitude search -F "%p %V %v %t" '?any-version(?installed ?not(?archive("^stable$")))'

Para excluir vários repositórios:

aptitude search -F "%p %V %v %t" '?any-version(?installed ?not(?archive("^(xenial|xenial-updates)$")))'

Observe também que alguns pacotes pertencem a vários repositórios, por exemplo xenial-security,xenial-updates. ?archive()avalia o padrão regex em relação a cada repositório individualmente, portanto ?archive("^xenial-updates$"), corresponderá a todos os pacotes pertencentes a xenial-updates, mesmo que também pertençam a outros repositórios.

Animismo
fonte