Encontre todos os pacotes instalados pelo usuário


38

Existe alguma maneira de obter uma lista de todos os pacotes instalados pelo usuário em um sistema Ubuntu, ou seja, os pacotes que foram instalados sobre os pacotes instalados padrão?

(A idéia é obter uma lista abrangente que possa ser usada para instalar os mesmos pacotes em uma instalação limpa do Ubuntu)

Respostas:


15

Olhe para esses arquivos,

  1. ' /var/log/installer/initial-status.gz' - sua instalação principal
    • essa data do arquivo seria sua data de instalação (eu acho)
    • ' /var/log/dpkg.log' atualizar a linha do tempo (é isso que você deseja)
    • ' /var/log/apt/term.log' - coisas aptatualizadas no seu sistema
    • ' /var/cache/apt/archives/'conterá os debpacotes baixados para instalação

Atualização: use as duas etapas a seguir para obter a lista exata de novas instalações:

  1. executar: grep -w install /var/log/dpkg.log > full-list.log
  2. Olhe linhas além do /var/log/installer/initial-status.gzcarimbo de data e hora

Como você deseja obter uma instalação limpa em outro sistema com esses pacotes, você pode até copiar os arquivos 'deb' do caminho 'cache / apt / archives' para o da nova instalação e instalá-los de uma só vez (sem fazer o download eles de novo).


Obrigado pela dica. É útil, embora eu estivesse procurando mais por um único comando para obter essa lista. cat /var/log/dpkg.log | grep 'instalar' parece vir perto se eu ignorar os itens instalados até a data de instalação / hora
Rabarberski

Adicionar um motivo para a votação descendente ajudaria a entender um problema na resposta, se houver um. Também levaria a melhores respostas no futuro.
Nik

Ops, o voto negativo foi acidentalmente meu. Eu já havia votado sua resposta. Quando tentei marcar sua resposta como 'final', cliquei errado e apertei a seta de votação para baixo. Tentando desfazer, a mensagem foi exibida: "Voto antigo demais para ser alterado, a menos que esta resposta seja editada". Desculpe Nik, tanto pelo voto negativo quanto pela confusão. :-(
Rabarberski

@ Rabarberski, bem, isso acontece ... nenhum dano causado.
Nik

não funciona se / var / log / installer não existir, como em uma instalação do servidor. Também faria sentido adicionar NÚMEROS DE VERSÃO se você estiver falando sobre "Ubuntu" - qual Ubuntu?

8

Apenas para sorrisos, montei uma linha (aqui dividida para maior clareza) que mostra os pacotes instalados manualmente , excluindo os instalados inicialmente e os pacotes instalados automaticamente:

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) \
  )

Isso funciona tanto dentro bashcomo dentro zsh.


Isso funciona quase perfeitamente, exceto que parece imprimir várias bibliotecas instaladas durante a instalação inicial. Há um monte de libtiff, libxcbetc, que eu não instalei. Esta resposta: superuser.com/a/105000/24349 cuida disso classificando de acordo com o tempo de instalação e removendo tudo antes do tempo de instalação do sistema. Ótimo (ab) uso de casca!
23412 haxney

3

Com base nas informações acima, escrevi um pequeno script Python para listar os pacotes que foram instalados manualmente. Veja este link .

Sinta-se livre para usá-lo, embora eu não assuma nenhuma responsabilidade por ele. No entanto, comentários e sugestões são sempre bem-vindos.


Brilhante! Demora um pouco para ser executado, mas é a única solução que encontrei que faz exatamente o que eu preciso!
haxney

2
Infelizmente, o link é agora quebrados (mostra um traceback python), que demonstra o valor de colocar a resposta aqui (especialmente para um "script curto python"
David Ljung Madison Stellar

Encontrei um repositório no github com o script: github.com/gerjantd/bin/blob/master/… Clique em 'raw' para fazer o download e execute com 'python list_manually_installed_packages.py'
David Ljung Madison Stellar

2
O link github agora está quebrado, também ...
Suzana


1

supondo que você tenha um histórico consistente e use o aptitude:

history | grep -e "^..... aptitude install"

listaria apenas os pacotes que você instalou com o aptitude install ... duh


1

Este é um trabalho de hacker, mas funciona completamente.

Primeiro, vá para http://releases.ubuntu.com/maverick/ (ou qualquer versão do Ubuntu que você esteja usando) e pegue o *.manifest fileque está associado à versão do Ubuntu que você está usando.

Em seguida, execute o seguinte script (substituição <manifest file>, colchetes angulares e tudo, com o caminho para o arquivo que você baixou. Você sempre pode anexar > outputao final para fazer um dump de arquivo.

diff --suppress-common-lines <(sed 's/ .*//' <manifest file>) <(dpkg --get-selections | sed 's/[ \t].*//') | grep '>' | sed 's/[>] //'

1

Obrigado geekosaur, bom código. Eu usei, mas demorou um pouco para descobrir como fazê-lo funcionar. Aqui está como eu fiz isso no Ubuntu 11.10 - ele funciona no terminal bash:

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) \
  ) > user-installed-packages

Em seguida, adicione uma guia \t- e installem cada linha:

sed 's/$/\tinstall/' user-installed-packages >uip

Em seguida, na nova máquina:

sudo dpkg --set-selections < uip

E para instalar os pacotes:

sudo apt-get dselect-upgrade

0

Outra maneira de fazer isso é determinar o que foi instalado com base em suas "tarefas", que determinam os pacotes base a serem instalados de acordo com suas necessidades iniciais.

tasksel --list-tasks

No mínimo, você teria server. No entanto, você pode optar por ter mais. Para cada uma dessas tarefas que você instalou, é possível obter uma lista dos pacotes instalados. O comando a seguir faz tudo em uma linha (discriminada por questão de clareza) para as que eu escolhi na minha instalação:

(tasksel --task-packages server ; \
 tasksel --task-packages openssh-server ; \
 tasksel --task-packages lamp-server) | sort | uniq

Uma abordagem genérica para o acima seria:

(for a in $( tasksel --list-tasks | grep "^i" | awk '{ print $2 }' ) ; \
 do tasksel --task-packages $a; done) | sort | uniq

Agora use apt-cache depends --installed -i --recurse <packagename> | grep -v "^ "para obter uma lista de dependências usadas por todos os pacotes definidos na tarefa. Isso pode ser feito em uma linha da seguinte maneira

apt-cache depends --installed -i --recurse \
     $(for a in $( tasksel --list-tasks | \
                   grep "^i" | \
                   awk '{ print $2 }' ) ; \
       do tasksel --task-packages $a; done) | grep -v "^ " | sort | uniq

A seguir, lista todos os pacotes que estão instalados no seu sistema (não incluindo dependências).

dpkg --get-selections | grep "[[:space:]]install" | awk '{print $1}'

Agora use o commcomando para encontrar os que estão na segunda lista apenas (ou seja, ignore os que estão nos dois arquivos e apenas no primeiro arquivo)

comm -13 <(apt-cache depends --installed -i --recurse \
              $(for a in $( tasksel --list-tasks | \
                            grep "^i" | \
                            awk '{ print $2 }' ) ; \
                do tasksel --task-packages $a; done) | grep -v "^ " | sort ) \
         <( dpkg --get-selections | grep "[[:space:]]install" | \
            awk '{print $1}' | sort)
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.