Como encontrar pacotes manualmente instalados?

47

Instalei um Ubuntu 10,1 simples no meu computador e instalei alguns softwares via apt-get. Na semana passada, consegui quebrar tudo e comecei do zero, e preciso reinstalar meu software. Existe alguma maneira de criar uma lista com todos os pacotes que eu instalei manualmente?

Para que me desse uma lista como texlive, ... e não texlive, texlive-dep1, textlive-dep2, ... e todos os pacotes padrão removidos?

Se eu conseguisse de alguma forma descobrir quais programas fora da instalação regular eu removi, isso também seria incrível!

Atualização 2015-05-23: agora uso o Ansible como gerenciamento de configuração em meus sistemas. Lá eu especifico os pacotes para instalar. Isso serve ao objetivo, instalando todos os programas em um sistema novo, melhor ainda. Então, essa questão pode ser a entrada em algum gerenciamento de configuração leve.

    
por Martin Ueding 25.03.2011 / 17:47

15 respostas

2

Eu finalmente entendi agora:

outfile="$(mktemp)"
pattern='(\[INSTALLIEREN\]|\[INSTALL\])'

if [[ -f "/var/log/aptitude.1.gz" ]]
then
        gunzip -c /var/log/aptitude.*.gz | grep -E "$pattern" | awk '{ print ; }' > "$outfile"
fi

if [[ -f "/var/log/aptitude" ]]
then
        grep -E "$pattern" "/var/log/aptitude" | awk '{ print ; }' >> "$outfile"
fi

sort "$outfile"
rm "$outfile"
    
por Martin Ueding 09.08.2011 / 23:18
25

Com esta sugestão, presumo que a sua instalação antiga ainda será inicializada!

Para replicar um conjunto de pacotes em outra máquina:

No sistema A, execute:

dpkg --get-selections | grep -v deinstall > my-selections

Mova o arquivo my-selections para o Sistema B.

No sistema B, execute:

dpkg --set-selections < my-selections

e depois:

sudo apt-get dselect-upgrade

Observação importante: se você instalou pacotes de repositórios e / ou PPAs não padrão, também será necessário copiar /etc/apt/sources.list e o conteúdo de /etc/apt/sources.list.d/ do Sistema A para o Sistema B antes de executar a atualização. / p>

Você pode usar dpkg para ver o que removeu também (NB: isso também incluirá pacotes que você instalou manualmente e foram removidos):

dpkg --get-selections | grep deinstall

Você pode ver seus resultados no terminal ou, claro, redirecionar para um arquivo.

    
por Mark Russell 25.03.2011 / 18:11
19

Este thread de superuser.com dá esta solução:

aptitude search '?installed ?not(?automatic)'
    
por Jason 02.05.2011 / 19:34
10

Se os seus logs apt estiverem em / var / log / apt, algo como isto deve funcionar:

gunzip -c /var/log/apt/history.log.*.gz | grep "apt-get install"

Ou se você quiser se livrar de parte do lixo repetitivo na saída:

gunzip -c /var/log/apt/history.log.*.gz | grep "apt-get install" \
  | cut -f4- -d" " | sort | uniq
    
por Mzzzzzz 17.10.2013 / 23:21
6

Você pode usar o apt-mark , mas eu recomendo < href="http://manpages.ubuntu.com/manpages/precise/en/man8/debfoster.8.html"> debfoster :

sudo apt-get install debfoster
sudo debfoster

Isso inspecionará todos os pacotes instalados e descobrirá quais estão mantendo os outros instalados:

texlive-full is keeping the following 161 packages installed:
  cm-super cm-super-minimal context doc-base dvipng feynmf
  fonts-gfs-artemisia fonts-gfs-baskerville fonts-gfs-bodoni-classic
  ...
Keep texlive-full? [Ynpsiuqx?], [H]elp:

À medida que você responde "y" a cada pergunta (basta pressionar Enter para se mover rapidamente), o debfoster coletará a lista de pacotes e os escreverá linha por linha em um arquivo. Por padrão, isso é em /var/lib/debfoster/keepers . Parece assim:

gnome-do
texlive-full
...

Eu configuro o debfoster via /etc/debfoster.conf para colocar essa lista em /etc/debfoster-keepers e rastreio o arquivo com etckeeper para manter o histórico e backups. A resposta aqui mostra como instalar uma lista de pacotes a partir de um arquivo de texto delimitado por nova linha:

sudo apt-mark manual $(cat debfoster-keepers)

Observe uma limitação aqui, os pacotes que você limpou têm um '-' na frente deles. Então você quer remover essas linhas antes de chamar apt-mark.

Mesmo que o site do debfoster diga que o debnoster está obsoleto em favor do aptitude, eu prefiro a configuração rápida e simples do debfoster. Ele coloca você no meio do seu banco de dados de pacotes e permite que você limpe as coisas, tornando os pacotes auto e manual mais óbvios.

Digite "h" no aviso do debingo para explicar suas opções. Tipo "?" para ver a descrição do pacote. O como fazer aqui pode ser útil.

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

Fornece todos os pacotes instalados manualmente (não pacotes do sistema, não dependências). Por exemplo, mostra build-essential , mas não gcc .

    
por ecerulm 22.05.2015 / 17:38
2

Eu sou capaz de puxar tudo abrindo os arquivos de log em / var / log / apt /

Eu entro e filtro manualmente os pacotes de instalação do apt-get. Pode haver uma maneira de fazer isso programaticamente, mas não estou ciente disso.

    
por marty331 25.04.2013 / 18:42
1
cd /var/log/apt
cat  history.log | grep Commandline

Desta forma, você vê a lista de comandos realizados no passado.

Remova o código do grep se precisar de mais informações:

less history.log

se o log estiver compactado (ou seja, terminar com gz)

gunzip <filename>

para compactar novamente quando terminar, você pode fazer:

gzip <filename>
    
por Zen 02.07.2013 / 17:32
1

Eu não vi nenhuma solução aqui trabalhar para mim, eu instalei alguns pacotes deb com o dpkg e alguns dos itens que eu estava procurando estavam faltando.

Um forro bastante longo, mas conveniente para copiar e colar, seria:

export DPKG_INITIAL=$(mktemp) DPKG_INSTALLED=$(mktemp) DPKG_CUSTOM=$(mktemp) DPKG_DEPS=$(mktemp) zgrep -E '^Package' /var/log/installer/initial-status.gz | awk '{ print  }' > $DPKG_INITIAL ; awk ' !~ /install|remove|purge/ { next } { gsub(/remove|purge/, "uninstall", ) ; gsub(/:.+/, "", ) ; a[]= } END { for (p in a) { if (a[p] == "install") { print p } } }' /var/log/dpkg.log | sort -u > $DPKG_INSTALLED ; comm -23 installed initial > $DPKG_CUSTOM ; function rdep() { apt-cache rdepends  | tail -n +3 | sed -e 's/^ //' -e '/^ /d' | cut -d':' -f1 | sort -u; } ; echo "$(for i in $(cat custom) ; do rdep $i ; done)" | sort -u > $DPKG_DEPS ; comm -23 custom deps > my-packages ; rm $DPKG_INITIAL $DPKG_INSTALLED $DPKG_CUSTOM $DPKG_DEPS

O comando acima salva uma lista de pacotes em um arquivo em seu diretório de trabalho atual chamado my-packages .

Explicação

Primeiro construí uma lista de pacotes que compunham a linha de base dos pacotes selecionados durante a instalação.

zgrep -E '^Package' /var/log/installer/initial-status.gz | awk '{ print  }' > initial

Seguido por uma longa lista de itens instalados em geral.

awk ' !~ /install|remove|purge/ { next } { gsub(/remove|purge/, "uninstall", ) ; gsub(/:.+/, "", ) ; a[]= } END { for (p in a) { if (a[p] == "install") { print p } } }' /var/log/dpkg.log | sort -u > installed

Em seguida, comparei os dois arquivos initial e installed para listar apenas os itens exclusivos da instalação.

comm -23 installed initial > custom

De lá, eu queria filtrar as dependências, é aí que esse método pode perder alguns pacotes desejados, ele não tem conhecimento das dependências que também são explicitamente instaladas.

Eu escrevi uma função bash rápida para encurtar essas etapas no processamento desses itens.

function rdep() { apt-cache rdepends  | tail -n +3 | sed -e 's/^ //' -e '/^ /d' | cut -d':' -f1 | sort -u; }

Depois disso, passei cada linha do meu arquivo custom para essa função com xargs .

echo "$(for i in $(cat custom) ; do rdep $i ; done)" | sort -u > deps

Uma vez que eu tive a longa lista de todas as dependências possíveis, (não tenho certeza sobre todas as declarações possíveis), mais uma vez eu peguei as linhas que eram exclusivas para um único arquivo.

comm -23 custom deps > manual

E minha lista finalizada de pacotes agora está em um arquivo chamado manual disponível para eu revisar.

    
por Steve Buzonas 14.04.2015 / 14:52
1

Para aqueles que preferem usar o apt- * tools, existe um utilitário apt-mark que permite consultar e modificar o estado manual / automático.

apt-mark showmanual

Você também pode especificar um padrão para os pacotes nos quais está interessado:

apt-mark showmanual qemu\*
    
por Alexander Koptelov 30.01.2017 / 17:21
0

Alguém vinculado ao link que tem um bom solução, mas não se comporta corretamente, pois a saída do aptitude mudou. Aqui está uma versão atualizada, baseada em comparação com pacotes atualmente instalados em comparação com 12.04 LTS. Você precisará do aptitude instalado, que é o único requisito.

aptitude search '~i !~M' -F '%p' | sort -u | tr -d ' ' > currentlyinstalled && wget -qO - http://mirror.pnl.gov/releases/precise/ubuntu-12.04.3-desktop-amd64.manifest | cut -f 1 | sort -u > defaultinstalled && comm -23 currentlyinstalled defaultinstalled

Para dividir o comando acima em partes, este bit gera um pacote por linha de tudo instalado no sistema

aptitude search '~i !~M' -F '%p' | sort -u | tr -d ' ' > currentlyinstalled

E isso faz o download da lista de pacotes padrão & amp; colhe a informação redundante.

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

e comm comparam os dois arquivos e geram os pacotes que não estão na lista padrão.

comm -23 currentlyinstalled defaultinstalled
    
por johndrinkwater 13.10.2013 / 19:56
0

Use um arquivo de manifesto de distribuição como o pacote básico definido. Classifique os resultados manualmente instalados em grupos de pacotes por arquitetura e seção, para facilitar a concentração em grupos de pacotes (talvez você não se importe com algumas seções).

link

#!/bin/bash

manifest_url='http://releases.ubuntu.com/releases/trusty/ubuntu-14.04.3-desktop-amd64.manifest'
manifest_file=$(echo $manifest_url | sed -e 's#.*/##g')
if [ ! -e $manifest_file ]; then
    wget -q $manifest_url
fi
cat $manifest_file | cut -f1 | sort -u > default_installed.txt

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

comm -23 currently_installed.txt default_installed.txt > manually_installed.txt

# sort the 'mannually_installed.txt' packages by architecture and section
mkdir -p package_files
while read p; do
    apt-cache show $p > info.txt
    arch=$(grep -m1 'Architecture: ' info.txt | sed -e 's/Architecture: //')
    section=$(grep -m1 'Section: ' info.txt | sed -e 's/Section: //' -e 's/\//_/g')
    file="${arch}_${section}_packages.txt"
    echo $p >> "package_files/$file"
done <manually_installed.txt

rm info.txt
    
por Darren Weber 29.09.2015 / 07:38
0
#! /bin/sh
DEFAULT='tempfile'
CURRENT='tempfile'
cat /var/log/installer/initial-status.gz | gzip -d | grep '^Package:' | awk '{ print }' | sort -u > $DEFAULT
aptitude search '~i !~M' -F '%p' | sort -u | tr -d ' ' | awk '{ print }' > $CURRENT
comm -23 $CURRENT $DEFAULT
rm $DEFAULT
rm $CURRENT
    
por Hir0 22.02.2014 / 14:39
0

Eu não encontrei um que fosse adequado para mim, então escrevi um roteiro. Pela análise do conteúdo de /var/log/apt/history.log* e / var / log / aptitude, então ordene por datetime, resultando em duas listas, uma é instalada manualmente, o outro é instalado, mas o pkgs é removido. Script com verificação 'lista de apt'. um pequeno desvio, pois o uso do dpkg instalou e modificou o código fonte do PPA.

Eu coloco aqui, link .

se alguém precisar testá-lo, talvez precise modificar algum código, pois meus arquivos de log estão misturados em chinês e inglês (especialmente formato de data e hora RFC2822), eu preciso lidar com isso.

    
por utopic eexpress 20.03.2017 / 20:40
0

Eu acho que você quer usar /var/log/apt/history.log e seus amigos para dar as alterações que foram feitas:

zcat /var/log/apt/history.log.*.gz | cat - /var/log/apt/history.log | grep -Po '^Commandline: apt(?:-get)? install (?!.*--reinstall)\K.*'

(Modificado de source )

Dará a você todos os pacotes que foram instalados na linha de comando usando uma variação de apt-get install .

Obtém os arquivos zipados no antigo history.log s adiciona-os com o atual history.log e passa pelo grep, extraindo linhas com apt [-get] install [e / ou reinstalando] e mostrando o resto da linha (-o flag) que corresponde ao (s) nome (s) do pacote.

Isso vai precisar de um pequeno modding (por exemplo, com sed ) se você quiser apenas os nomes dos pacotes em linhas separadas; um exercício para o leitor!

Vale a pena notar que o gerenciador de pacotes sinápticos ( gksu synaptic ou kdesudo synaptic ) na seção "status" possui uma lista "installed (manually)". Se você marcar a lista inteira para remoção [não aplique !!], você poderá salvar as alterações marcadas e obter uma lista de pacotes dessa maneira. Cuidado: isso trava synaptic para mim (calculando presumivelmente as remoções de dependência).

    
por pbhj 04.02.2018 / 17:37

Tags