it-swarm-pt.tech

Listar pacotes instalados explicitamente

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, 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?

53
phunehehe

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 à 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. O --disable-columns impede que o aptitude preencha linhas de nomes de pacotes com espaços em branco que dificultariam a comparação abaixo. O | sort -u classifica o 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 em defaultinstalled.txt.

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

Esta é a parte mais fácil, pois a maioria dos sistemas tipo Unix 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. Portanto, ele deve imprimir uma lista de pacotes instalados que não estão na instalação padrão.

46
Steven D

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 estes são realmente instalados pelo usuário, logo após a instalação pela configuração da localização do idioma ou por exemplo através do instalador do codec Totem. Além disso, as versões do cabeçalho 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 o espaço em branco restante 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 também não funcionam:

  • Usando o ubuntu-14.04-desktop-AMD64.manifest file ( 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 apt-mark showauto ao invés de /var/log/installer/initial-status.gz. apt-mark por exemplo, não inclui o pacote xserver-xorg, enquanto o outro arquivo inclui.

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

24
jmiserez

De acordo com man apt-mark:

apt-mark showauto
apt-mark showmanual
9
mmaruska

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

NOTE :

  • Eu verifiquei tanto aptitude e sináptico (versões ,7 e ,6. respectivamente), e ambos registram suas atividades nesse arquivo de log. O único contratempo com eles é que eles não têm a linha começando com Commandline, portanto o truque grep não funcionará com eles.
8
tshepang

Me deparei com esse oneliner bonito enquanto eu procurava essa 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

Vou postar 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.

7
Archit

Você gostaria de dar uma olhada em este artigo .

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

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

3
Stefan

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

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

2
Wes Turner

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

1
Joril

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.

1
Laurent Lyaudet

Muito obrigado e parabéns a quem criou a jóia de um roteiro !!!
Eu 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 falha.
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, seguidos pelos que foram atualizados.
Arrumado! Aproveitar.

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
0
Papou