Listar pacotes instalados explicitamente

53

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

Existe um arquivo semelhante ou um comando para encontrar essas informações no Ubuntu?

phunehehe
fonte

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 maneira de pensar sobre esse problema é dividir isso em três partes:

  • Como obtenho uma lista de pacotes não instalados como dependências?
  • Como obtenho 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

Abordagens semelhantes podem ser encontradas nos links que Gilles postou como um comentário para a pergunta. Algumas fontes afirmam que isso só funcionará se você tiver usado o aptitude para instalar os pacotes; no entanto, quase nunca uso o aptitude para instalar pacotes e descobri que isso ainda funcionava. Os --disable-columnsimpede aptitude de preenchimento linhas de nomes de pacotes com espaços em branco, que impeçam a comparação abaixo. Classifica | sort -uo arquivo e remove duplicatas. Isso facilita muito a etapa final.

Como obtenho uma lista dos pacotes instalados por padrão?

Nota: Esta seção começa com um 'caminho errado' que eu acho ilustrativo. O segundo pedaço de código é aquele que funciona.

Isso é um pouco mais complicado. Inicialmente, pensei que uma boa aproximação seria todos os pacotes dependentes dos meta-pacotes ubuntu-minimal, ubuntu-standard, ubuntu-desktop e 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, 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 tinham que vir por padrão. Ainda acredito que esse método funcione se alguém construir a lista correta de metapacotes.

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

http://mirror.pnl.gov/releases/precise/ubuntu-12.04.3-desktop-amd64.manifest

Se você pesquisar nesta página (ou na página de um espelho mais próxima de você):

http://mirror.pnl.gov/releases/precise/

Você deve conseguir 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 única, mas eu queria ter certeza de que estava corretamente classificada para facilitar o próximo passo. Eu então coloco a saída defaultinstalled.txt.

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

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

comm -23 currentlyinstalled.txt defaultinstalled.txt

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

Steven D
fonte
O que seu primeiro pipeline faz que aptitude search '~i!~M' -F %pnão?
ephemient 30/10/10
@hemhemient: Provavelmente nada. Eu não sei muito sobre aptitude e, portanto, usei ferramentas com as quais estou familiarizado, em vez de procurar no arquivo man de um programa que nunca uso.
Steven D
11
Você tipo de destruir a minha esperança, eu achava que havia algum padrão forma fácil :(
phunehehe
3
Isso quase funciona, mas ainda não está correto. Existem vários pacotes e bibliotecas que eu certamente não instalei manualmente contidos na lista resultante. Eu usei http://releases.ubuntu.com/releases/trusty/ubuntu-14.04-desktop-amd64.manifeste o adicional, | sed "s/ *$//"mas ainda sem dados.
21134 jmiserez
11
A primeira etapa que obtém uma lista de pacotes não instalados como dependências pode ser substituída apt-mark showmanual | sort -u, conforme mostrado em outras respostas. Mais simples e não depende do aptitudeque não está instalado por padrão.
Skagedal
24

Você pode usar um desses dois one-liners. Ambos produzem exatamente a mesma saída na minha máquina e são mais precisos do que todas as soluções propostas até agora (julho de 2014) nesta 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 caem nas falhas, embora eu suspeite que eles sejam realmente instalados pelo usuário, logo após a instalação pela configuração da localização do idioma ou, por exemplo, pelo instalador do codec Totem. Além disso, as versões do cabeçalho linux também parecem se acumular, embora 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. Por aptidão, o adicional sedremove 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 produza as linhas no arquivo 1 que não estão presentes no arquivo 2.

Outras possibilidades não funcionam tão bem:

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

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

jmiserez
fonte
Se você atualizou seu sistema desde a sua instalação inicial (que é o caso da maioria das pessoas), é melhor usar o arquivo de manifesto da sua versão atual do Ubuntu.
Diego V
Se você atualizou, acho que precisaria usar os dois arquivos, não apenas o arquivo de manifesto. Você pode fazer isso facilmente adicionando outra comparação. Infelizmente, o arquivo de manifesto não contém tudo o que o arquivo initial_status.gz (verifiquei).
jmiserez
Estou impressionado! Eu encontrei uma peça que faltava no entanto. E os pacotes que foram instalados inicialmente, mas depois foram removidos manualmente explicitamente , no entanto, posteriormente foram reinstalados manualmente explicitamente ? Eu encontrei isso em um sistema de trabalho.
N611x007
11
Fiz uma pergunta unix.SE/225330: Liste pacotes removidos explicitamente (apt) para abordar a maior parte do trabalho.
N611x007
11
Isto é melhor do que a solução aceita, desde o mirror.pnl.gov/releases/precise/... URL na solução aceita é agora um 404.
rmunn
9

De acordo com man apt-mark:

apt-mark showauto
apt-mark showmanual
mmaruska
fonte
2
showmanualestá mostrando coisas como xserver-xorg-video-vesa, que eu juro que não instalei manualmente.
phunehehe
provavelmente instalado automaticamente pela sua distribuição na primeira instalação.
Matt
8

Aqui está um exemplo 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 o material com grep ( cat /var/log/apt/history.log | grep Commandline).

Observe que esses arquivos são rotacionados; portanto, verifique 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 o aptitude e o synaptic (versões 0.70 e 0.6.3, respectivamente), e os dois registram suas atividades nesse arquivo de log. O único contratempo com eles é que eles não têm a linha inicial Commandline, portanto o greptruque não funcionará com eles.
tshepang
fonte
2
Solução interessante. Você precisará ajustar um pouco o comando grep para obter apenas uma lista de pacotes e contabilizar os pacotes instalados por aptitudee outros gerenciadores de pacotes. Se seus registros foram girados para longe, então você está sem sorte.
Steven D
@steven Atualizado. Meu grep-fu é novato, então deixarei isso para o leitor. Além disso, não sei se a coisa gira para longe. Eu só tenho que arquivar lá.
tshepang 23/01
A rotação dos mesmos dependerá da configuração da rotação do log e de quanto tempo o sistema existe. Não tenho certeza dos padrões do Ubuntu, pois faz muito tempo que eu os mudei.
Steven D
7

Me deparei com este lindo oneliner enquanto procurava esta consulta

O 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 oneliner filtra pacotes instalados pelo sistema usando logs de /var/log/installer/initial-status.gz

Postarei o link no tópico original quando o encontrar, pois esse oneliner não é meu e não consigo me lembrar de onde o vi.

Archit
fonte
3

Você gostaria de dar uma olhada neste artigo .

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

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

Stefan
fonte
3
o link não parece mais funcionar.
RogerioJul
2
Links quebrados como esses são o motivo pelo qual é importante incluir as informações relevantes em sua resposta.
whitehat101
2

Abaixo é uma adição à resposta Steven D's .

A seguinte linha parece estar truncando nomes de pacotes com 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

Wes Turner
fonte
1

Verificação de saída /var/log/apt/term.log

Joril
fonte
2
que é uma forma bastante doloroso para fazer as coisas, e não há nenhuma distinção entre pacotes de me instalar, e aqueles obtidos por dependências
phunehehe
Eu concordo, mas eu não sabia que o apt mantém o controle dos: / Agora eu sei, graças a Stefan :)
Joril
1

Você também pode olhar para 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.

Laurent Lyaudet
fonte
0

Muito obrigado e parabéns a quem criou a jóia de um roteiro !!!
Queria adicionar meus 2 ¢ e adotei a data de instalação que deduzi de $ info.
Eu não dominei os detalhes por que os arquivos $ info são atualizados ou não e quando, mas funciona na prática.
Meu script lista as atualizações mais recentes dos pacotes sem dependência adicionados após a instalação.
Fazendo uma verificação periódica, eu estava vendo o que eu teria registrado manualmente sem uma única falta.
Ou seja, lotes de pacotes instalados pelo mesmo motivo. Infelizmente, as atualizações quebram essa ordem.
Após uma atualização do sistema, eu tinha uma lista dos meus pacotes adicionados que a atualização não atualizou seguida por aqueles que foram atualizados.
Arrumado! Desfrutar.

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}?).*/\1/') $n
done < /tmp/packages | sort
Papou
fonte