Listar pacotes explicitamente instalados

53

No Gentoo, há o arquivo /var/lib/portage/world que contém pacotes que eu instalei explicitamente. Por explícito quero dizer, pacotes que eu escolho, não incluindo nada instalado por padrão, ou puxado pelas dependências.

Existe algum arquivo ou comando semelhante para encontrar essa informação no Ubuntu?

    
por phunehehe 29.10.2010 / 05:47

10 respostas

46

Apenas o código

aptitude search '~i !~M' -F '%p' --disable-columns | sort -u > currentlyinstalled.txt
wget -qO - http://mirror.pnl.gov/releases/precise/ubuntu-12.04.3-desktop-amd64.manifest \
  | cut -f1 | sort -u > defaultinstalled.txt
comm -23 currentlyinstalled.txt defaultinstalled.txt

Explicação

Uma forma de pensar sobre esse problema é dividir isso em três partes:

  • Como obtenho uma lista de pacotes não instalados como dependências?
  • Como faço para obter uma lista dos pacotes instalados por padrão?
  • Como posso obter a diferença entre essas duas listas?

Como obtenho uma lista de pacotes não instalados como dependências?

O seguinte comando parece funcionar no meu sistema:

$ aptitude search '~i !~M' -F '%p' --disable-columns | sort -u > currentlyinstalled.txt

Enfoques semelhantes podem ser encontrados nos links que Gilles postou como um comentário para a questão. Algumas fontes afirmam que isso só funcionará se você usou o aptitude para instalar os pacotes; No entanto, quase nunca uso o aptitude para instalar pacotes e descobri que isso ainda funcionava. O --disable-columns impede o aptitude de preencher linhas de nomes de pacotes com espaços em branco que impediriam a comparação abaixo. O | sort -u classifica o arquivo e remove as duplicatas. Isso torna a etapa final muito mais fácil.

Como faço para obter uma lista dos pacotes instalados por padrão?

Note: This section starts out with a 'wrong path' that I think is illustrative. The second piece of code is the one that works.

Isso é um pouco mais complicado. Inicialmente pensei que uma boa aproximação seria todos os pacotes que são dependências dos meta-pacotes ubuntu-minimal, ubuntu-standard, ubuntu-desktop e os vários pacotes relacionados ao kernel do Linux. Alguns resultados nas pesquisas do Google pareciam usar essa abordagem. Para obter uma lista dessas dependências, primeiro tentei o seguinte (que não funcionou):

$ apt-cache depends ubuntu-desktop ubuntu-minimal ubuntu-standard linux-* | awk '/Depends:/ {print $2}' | sort -u

Isso parece deixar de fora alguns pacotes que eu sei que vieram por padrão. Eu ainda acredito que este método funcione se construirmos a lista correta de meta-pacotes.

No entanto, parece que os espelhos do Ubuntu contêm um arquivo "manifest" que contém todos os pacotes na instalação padrão. O manifesto para o Ubuntu 12.04.3 está aqui:

link

Se você pesquisar por essa página (ou a página de um espelho mais perto de você):

link

Você deve ser capaz de encontrar o arquivo ". manifest" que corresponde à versão e arquitetura que você está usando. Para extrair apenas os nomes dos pacotes, fiz isso:

wget -qO - http://mirror.pnl.gov/releases/precise/ubuntu-12.04.3-desktop-amd64.manifest | cut -f1 | sort -u > defaultinstalled.txt

A lista provavelmente já estava classificada e era única, mas eu queria ter certeza de que estava classificada corretamente para facilitar o próximo passo. Em seguida, coloco a saída em defaultinstalled.txt .

Como posso obter a diferença entre essas duas listas?

Esta é a parte mais fácil, já que a maioria dos sistemas Unix-like tem muitas ferramentas para fazer isso. A ferramenta comm é uma das muitas maneiras de fazer isso:

comm -23 currentlyinstalled.txt defaultinstalled.txt

Isso deve imprimir a lista de linhas exclusivas do primeiro arquivo. Assim, deve imprimir uma lista de pacotes instalados que não estão na instalação padrão.

    
por 30.10.2010 / 06:22
24

Você pode usar um desses dois one-liners. Ambos produzem exatamente o mesmo resultado em minha máquina e são mais precisos do que todas as soluções propostas até agora (julho de 2014) nessa questão. Eles são uma combinação das duas respostas (1) e (2) . Note que eu originalmente postei esta resposta aqui .

Usando apt-mark :

comm -23 <(apt-mark showmanual | sort -u) <(gzip -dc /var/log/installer/initial-status.gz | sed -n 's/^Package: //p' | sort -u)

Usando aptitude :

comm -23 <(aptitude search '~i !~M' -F '%p' | sed "s/ *$//" | sort -u) <(gzip -dc /var/log/installer/initial-status.gz | sed -n 's/^Package: //p' | sort -u)

Pouquíssimos pacotes ainda estão perdidos, embora eu suspeite que esses sejam realmente instalados pelo usuário, logo após a instalação, por meio da configuração de localização de idioma ou, por exemplo, através do instalador do codec Totem. Além disso, as versões do cabeçalho do Linux também parecem se acumular, mesmo que eu tenha instalado apenas o metapacote não específico da versão. Exemplos:

libreoffice-help-en-gb
openoffice.org-hyphenation
gstreamer0.10-fluendo-mp3
linux-headers-3.13.0-29    

Como funciona

  1. Obtenha a lista de pacotes instalados manualmente. Para o aptitude, o sed adicional retira os espaços em branco restantes no final da linha.
  2. Obtenha a lista de pacotes instalados logo após uma nova instalação.
  3. Compare os arquivos, apenas imprima as linhas no arquivo 1 que não estão presentes no arquivo 2.

Outras possibilidades também não funcionam:

  • Usando o arquivo ubuntu-14.04-desktop-amd64.manifest ( aqui para o Ubuntu 14.04) de /var/log/installer/initial-status.gz . Mais pacotes são mostrados como instalados manualmente, mesmo que não sejam.
  • Usando apt-mark showauto em vez de /var/log/installer/initial-status.gz . apt-mark , por exemplo, não inclui o pacote xserver-xorg, enquanto o outro arquivo faz.

Ambos listam mais pacotes do que a solução acima.

    
por 06.07.2014 / 17:07
9

De acordo com man apt-mark :

apt-mark showauto
apt-mark showmanual
    
por 09.09.2012 / 12:32
8

Veja alguns exemplos de saída de cat /var/log/apt/history.log :

Start-Date: 2011-01-22  00:43:38
Commandline: apt-get --target-release experimental install libdbus-1-dev
Upgrade: libdbus-1-3:i386 (1.4.0-1, 1.4.1-1), libdbus-1-dev:i386 (1.4.0-1, 1.4.1-1)
End-Date: 2011-01-22  00:43:48

Start-Date: 2011-01-23  01:16:13
Commandline: apt-get --auto-remove purge webcheck
Purge: python-utidylib:i386 (0.2-6), python-beautifulsoup:i386 (3.1.0.1-2), libtidy-0.99-0:i386 (20091223cvs-1), webcheck:i386 (1.10.3)
End-Date: 2011-01-23  01:16:31

Quanto à sua pergunta, filtre as coisas com o grep ( cat /var/log/apt/history.log | grep Commandline ).

Observe que esses arquivos são girados, portanto, verifique os outros para não perder nada:

$ ls /var/log/apt/history.log*
-rw-r--r-- 1 root root 69120 2011-01-23 18:58 /var/log/apt/history.log
-rw-r--r-- 1 root root 19594 2011-01-01 02:48 /var/log/apt/history.log.1.gz

NOTA :

  • Eu verifiquei as aptitude e synaptic (versões 0.70 e 0.6.3 respectivamente), e ambos registram suas atividades nesse arquivo de log. O único revés com eles é que eles não têm a linha que começa com Commandline , então o truque grep não funcionará com eles.
por 23.01.2011 / 23:14
7

Me deparei com esse belo oneliner enquanto pesquisava essa consulta

O único forro é

comm -13 \
  <(gzip -dc /var/log/installer/initial-status.gz | sed -n 's/^Package: //p' | sort) \
  <(comm -23 \
    <(dpkg-query -W -f='${Package}\n' | sed 1d | sort) \
    <(apt-mark showauto | sort) \
  )'

Este pacote de filtros on-line instalado pelo sistema usando logs de /var/log/installer/initial-status.gz

Vou postar o link para o tópico original quando o encontrei, já que este oneliner não é meu e parece que não consigo lembrar onde o vi.

    
por 24.06.2013 / 19:13
3

Você gostaria de dar uma olhada em este artigo .

No final do artigo, há um script python que deve fazer o que você quer.

Foi escrito para o (k) ubuntu . mas deve funcionar para o Ubuntu também.

    
por 29.10.2010 / 09:26
2

Abaixo está uma adição à resposta de Steven D .

A linha a seguir parece estar truncando nomes de pacotes em 32 caracteres:

aptitude search '~i !~M' | cut -d" " -f4 | sort -u > currentlyinstalled.txt

Isso parece funcionar:

aptitude search '~i !~M' -F "%p" > sort -u > currentlyinstalled.txt

veja esta resposta

    
por 09.08.2013 / 09:22
1

Confira /var/log/apt/term.log

    
por 29.10.2010 / 08:53
1

Você também pode ver o arquivo /var/lib/apt/extended_states .

cat /var/lib/apt/extended_states | grep -B2 'Auto-Installed: 0'

Isso é útil se você quiser saber o que foi instalado em uma partição antiga.

    
por 04.04.2018 / 21:08
0

Um grande obrigado e parabéns para aqueles que criaram a gema de um roteiro !!!
Eu queria adicionar meu 2 ¢ e eu adicionei a data de instalação que deduzi de $ info.
Eu não dominei os detalhes porque os arquivos $ info são atualizados ou não e quando, mas funciona na prática.
Meu script lista as atualizações mais recentes de pacotes não dependentes adicionados após a instalação.
Dando uma checagem periódica, eu estava vendo o que teria logado manualmente sem uma única falha.
Ou seja, lotes de pacotes instalados pelo mesmo motivo. Infelizmente, as atualizações quebram esse pedido.
Após uma atualização do sistema, eu tinha uma lista dos meus pacotes adicionados que a atualização não atualizou, seguidos por aqueles que ela fez.
Arrumado! Aproveite.

info='/var/lib/dpkg/info/'

comm -13 > /tmp/packages \
  <(gzip -dc /var/log/installer/initial-status.gz | sed -n 's/^Package: //p' | sort) \
  <(comm -23 \
    <(dpkg-query -W -f='${Package}\n' | sed 1d | sort) \
    <(apt-mark showauto | sort) \
  )

while read n; do
  echo $(ls -ltr --time-style=long-iso $info$n.* $info$n:i386.* $info$n:amd64.* 2>/dev/null \
    | tail -n 1 | perl -pe 's/.*([0-9]{4}?-.*:[0-9]{2}?).*//') $n
done < /tmp/packages | sort
    
por 25.05.2018 / 21:55