Como obtenho uma lista de pacotes obsoletos?


19

Estou tentando descobrir uma maneira de obter uma lista dos pacotes que não estão mais disponíveis nos repositórios que eu habilitei. Esta estação de trabalho passou por várias versões do Ubuntu e teve muitos repositórios de terceiros adicionados e removidos. Gostaria de obter uma lista do software que tenho desses repositórios removidos, para que eu possa limpá-lo ou adicionar novamente os repositórios apropriados.

Respostas:


23
aptitude search '~o'

O Aptitude tem algumas pesquisas muito poderosas disponíveis. Infelizmente, a sintaxe é um pouco pesada e você precisa ir além da página de manual para encontrar a documentação, mas vale a pena.

O apt-show-versões também pode ser útil:

apt-show-versions | grep 'No available version'

11
veja um bom artigo sobre pacotes obsoletos aqui: raphaelhertzog.com/2011/02/07/…
Lluís

Outra lista útil é gerada porapt-show-versions | grep "newer than version in archive"
Sean

Eu acho que o apt-show-versões é o melhor simplesmente porque a linha de aptidão é extremamente contra-intuitiva de se lembrar. Toda vez que preciso, preciso pesquisar no google / procurar / salvar / criar um script / etc.
j riv

6

Para obter uma lista de aplicativos que não estão em um Repositório Registrado ou PPA, faça o seguinte:

sudo apt-get install apt-show-versions
apt-show-versions | grep 'No available version'

Isso deve gerar um texto como este:

app1 1.0.0.14 installed: No available version in archive
app23 0.3.6 installed: No available version in archive
app332 7.0.9377 installed: No available version in archive

Para mim, isso funcionou e mostrou três aplicativos que eu instalei usando pacotes DEB e não estavam disponíveis em um Repo ou PPA.

Lembre-se, porém, de que é impossível verificar todos os programas, apenas os que foram aprovados dpkg. Por exemplo, alguns aplicativos são instalados simplesmente extraindo-os para as pastas corretas ou outros usam um bin ou script de instalador independente. Portanto, a melhor maneira é manter uma lista de aplicativos instalados por qualquer método que não seja o APT.


Funciona para todos os meus dpkgpacotes instalados locais . Uma exceção Ele lista skype-bin, enquanto apt-cache policy skype-binmostra claramente o repositório de parceiros da Canonical. Não tenho certeza do que está acontecendo. Problema multiarca? Ainda +1 para apt-show-versions!
precisa saber é

O aptitude chama esses pacotes 'obsoletos'. Veja o comentário sobre cronite acima.
quer

5

Se você possui o aptitude instalado,

aptitude search '?obsolete'

ou sua forma abreviada

aptitude search '~o'

Aqui está uma amostra de saída

i A gcc-4.7-base - GCC, the GNU Compiler Collection (base package)
id  libdb4.7     - Berkeley v4.7 Database Libraries [runtime]
i   libudev0     - libudev shared library

O primeiro caractere de cada linha indica o estado atual do pacote. Os estados mais comuns são:

  • p, o que significa que nenhum rastreio do pacote existe no sistema,
  • c, significando que o pacote foi excluído, mas seus arquivos de configuração permanecem no sistema,
  • i, significando que o pacote está instalado e
  • v, significando que o pacote é virtual.

O segundo caractere indica a ação armazenada a ser executada na embalagem, se houver, caso contrário, um espaço em branco é exibido. As ações mais comuns são:

  • i, significando que o pacote será instalado,
  • d, significando que o pacote será excluído e
  • p, o que significa que o pacote e seus arquivos de configuração serão removidos.

Se o terceiro caractere for A, o pacote foi instalado automaticamente.

Para obter uma lista completa dos possíveis sinalizadores de estado e ação, consulte a seção Acessando informações do pacote no guia de referência do aptitude.


11
aptitude search ?obsoletepodem trabalhar em bash, mas você deve usaraptitude search '?obsolete'
AB

você poderia adicionar alguns detalhes ao analisar a saída?
Elder Geek

'Obsoleto' é diferente de '~ o'?
Sean

@ Sean Não, eles não são diferentes. ~ o é a forma abreviada de "obsoleto" de fato.
Demis Palma ツ

As aspas são analisadas pelo shell. Acho que o que AB quis dizer é que você não deve passar caracteres estranhos sem escape na linha de comando, porque você não sabe o que seu shell fará com eles.
21315 Sean

2

A partir do Ubuntu 19.10, também é possível executar

apt list ?obsolete

para obter a lista de pacotes obsoletos.

Para qualquer versão, você pode usar a seguinte linha única do Bash:

comm -23 <(dpkg-query -W -f '${db:Status-Abbrev}\t${Package}\n' | grep '^.[^nc]' | cut -f2 | sort) <(apt-cache dumpavail | sed -rn 's/^Package: (.*)/\1/p' | sort -u)

Não há necessidade de instalar pacotes extras para isso, além disso, é relativamente rápido. Isso também encontrará pacotes parcialmente instalados (mas não encontrará aqueles que têm apenas arquivos de configuração restantes; que podem ser alterados facilmente). Nota: isso não se importa com a arquitetura dos pacotes.

Se você deseja incluir pacotes com uma versão diferente instalada do que está disponível nos repositórios, você pode:

Use o apt moderno:

 apt list --installed | awk -F/ '/\[installed,local\]/{print $1}'

Outra opção é executar

ubuntu-support-status --show-unsupported

e leia os nomes dos pacotes na seção "Não está mais disponível para download:".


'apt list --manual-instalado | grep -v cósmico 'mostra falsos positivos. Esta resposta é muito melhor!
TamusJRoyce 18/09

11
@TamusJRoyce, sim, suponho que agora após a edição.
jarno 18/09

1

Mais informações para investigar.

ubuntu-support-status 
echo "pacotes $ (sudo apt-mark showmanual | wc -l) marcados como 'instalados manualmente'."

... o ubuntu-support-status e o apt-mark podem exigir instalação.


Não há necessidade de usar sudocom apt-mark showmanual.
jarno 18/09

ubuntu-support-statuslista o número de pacotes obsoletos, mas não os nomes dos pacotes.
jarno 18/09

11
Leia a saída deubuntu-support-status --help
Hannu

Oh, obrigado pela dica.
jarno 20/09

0

Pode haver uma maneira mais limpa, mas em cima da minha cabeça você pode fazer

dpkg -l | cut -f 3 -d ' ' > installed
xargs -n 1 --replace=X apt-cache search ^X$ < installed | cut -f 1 -d ' ' > available
diff installed available

Limpe as primeiras linhas do installedarquivo: ele terá cabeçalhos.

Bônus se alguém puder corrigir meu destaque de sintaxe ...


2
se você usar a saída de dpkg -lpara obter uma lista de pacotes instalados, limite os resultados às linhas com 'i' na segunda coluna, pois o dpkg também listará pacotes que não estão instalados (talvez removidos, mas não eliminados) . como exemplo, alterar seu primeiro comando dpkg -l | grep '^.[^i]' | cut -f 3 -d ' ' retornaria uma lista de pacotes que NÃO estão instalados. (mas já foram) #
stew

11
Além disso, apt-cache search someinstalledpackageretornará algo mesmo que o pacote não esteja disponível em um repositório, portanto, não acredito que isso funcione.
stew

11
@stew Vou deixar isso aqui para ver se alguém chega a conclusões, mas sua resposta é definitivamente muito melhor. +1 para você.
22412 Jeff Jeffland

O @stew dpkg -l | grep '^.[^i]' | cut -f 3 -d ' 'também imprime algumas linhas de cabeçalho.
jarno 18/09

Mesmo que essa resposta funcionasse, seria muito lenta, pois seria executada apt-cache searchpara cada pacote separadamente.
jarno 18/09

0

Como mencionado, o apt-get search não é um bom método para verificar se um pacote ainda está disponível. Adicionamos tudo a apenas uma linha:

for i in `dpkg -l | grep '^i' | awk '{ print $2 }'`; do apt-cache show $i > /dev/null || echo $i; done

E por quegrep '^i'
AB

@AB bom ponto; isso não informa se o pacote está instalado, mas que a ação desejada do pacote deve ser instalada. Veja man dpkg-querypara mais informações.
jarno 17/09

Isso é muito lento
jarno 17/09

apt-cache showO does not não é bom para verificar se o pacote está disponível. Se você desabilitar o respectivo repositório, e nenhum outro repositório habilitado o possuir, ele ainda mostrará o pacote.
jarno 21/09
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.