Como encontrar pacotes instalados manualmente?


48

Eu instalei um Ubuntu 10.10 simples no meu computador e instalei algum software via apt-get. Na semana passada, eu consegui quebrar tudo e comecei do zero e preciso reinstalar o 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 pudesse descobrir de alguma forma quais programas da instalação regular removi, isso também seria incrível!


Atualização 23/05/2015: Agora uso o Ansible como gerenciamento de configuração em meus sistemas. Lá eu especifico os pacotes a serem instalados. Isso serve à meta, instalando todos os programas em um sistema novo, ainda melhor. Portanto, essa pergunta pode ser a entrada em algum gerenciamento de configuração leve.

Respostas:


24

Com essa sugestão, estou assumindo que 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 my-selectionsarquivo para o Sistema B.

No sistema B, execute:

dpkg --set-selections < my-selections

e depois:

sudo apt-get dselect-upgrade

Nota importante: se você instalou pacotes de repositórios não padronizados e / ou PPAs, também desejará copiar /etc/apt/sources.liste o conteúdo /etc/apt/sources.list.d/do Sistema A para o Sistema B antes de executar a atualização.

Você também pode dpkgver o que removeu (NB: isso também inclui pacotes que você instalou e removeu manualmente ):

dpkg --get-selections | grep deinstall

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


9
Gostaria de obter uma lista de todos os pacotes, mas gostaria de ter apenas os nomes dos pacotes que instalei explicitamente. Tão justo somethinge não something-commontão bem.
— Martin Ueding

6
Sim, embora isso seja útil, ele não faz o que a pergunta faz.
— precisa saber é o seguinte

3
Se você fizer isso, as dependências instaladas automaticamente nunca serão limpas quando você remover os programas. Por que as pessoas votam positivamente em uma resposta que faz o que o solicitante disse especificamente que não queria?
— Jbo5112

20

Este tópico do superuser.com fornece esta solução:

aptitude search '?installed ?not(?automatic)'

2
Isso não funciona para mim. Apenas lista tudo o que está instalado, ou certamente mais do que eu pedi explicitamente.
— precisa saber é o seguinte

Ele lista tudo o que você instalou apt-get, além de suas dependências. Assim, por exemplo, se você instalou aptitude, então ele irá também listaapt-xapian-index aptitude-common libboost-iostreams1.54.0 libclass-accessor-perl libcwidget3 libept1.4.12 libio-string-perl libparse-debianchangelog-perl libsigc++-2.0-0c2a libsub-name-perl libtimedate-perl libxapian22 python-chardet python-debian python-six python-xapian
— Runemoro

10

Se seus logs do 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 alguns dos itens repetitivos indesejados na saída:

gunzip -c /var/log/apt/history.log.*.gz | grep "apt-get install" \
  | cut -f4- -d" " | sort | uniq

6

Você pode usar o apt-mark , mas eu recomendo o 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:

Conforme você responde "y" a cada pergunta (basta pressionar Enter para mover-se 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. Se parece com isso:

gnome-do
texlive-full
...

Eu configurei o debfoster via /etc/debfoster.confpara colocar esta lista /etc/debfoster-keeperse acompanhar o arquivo com o etckeeper para manter o histórico e os 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ê deseja remover essas linhas antes de chamar apt-mark.

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

Digite "h" no prompt do debfoster para explicar suas opções. Tipo "?" para ver a descrição do pacote. O tutorial aqui pode ser útil.


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). Para exemplos, mostra, build-essentialmas não gcc.


3

Para aqueles que preferem usar as ferramentas apt- *, 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 você está interessado:

apt-mark showmanual qemu\*

Este é o bilhete.
— John Von Neumann

2

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 $2; }' > "$outfile"
fi

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

sort "$outfile"
rm "$outfile"

2
Eu acho que isso só funciona se você só instalou pacotes usando o aptitude. Existem arquivos semelhantes no /var/log/apt/history.log(.N.gz)entanto.
— precisa saber é o seguinte

Você pode usar em zgrepvez de gunzipou zcatcanalizado para grep. É um script wrapper que vem com o gzip, eu acredito. Ele também aceita arquivos descompactados, para que você possa simplificar o seu script parazgrep -E '(\[INSTALLIEREN\]|\[INSTALL\])' /var/log/aptitude* | awk '{ print $2 }'
— Steve Buzonas

2

Sou capaz de extrair tudo abrindo os arquivos de log em / var / log / apt /

Então 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.


1
cd /var/log/apt
cat  history.log | grep Commandline

Dessa forma, você vê a lista de comandos executados no passado.

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

less history.log

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

gunzip <filename>

para compactá-lo novamente quando terminar, você pode:

gzip <filename>

1
Em vez de descompactar e recomprimir os arquivos de log, por que não usar zcat? É tão fácil quanto zcat filename.gz. Pode-se apenas usá-lo em arquivos compactados gzip no lugar de cat. Também greppode ser substituído por zgrep, por exemplo zgrep Commandline history.log.1.gz.
— Lgarzo

Com base em sua idéia que eu vim acima com uma linha de comando: (grep "Commandline" history.log ; zgrep "Commandline" history.log.*.gz ) | grep " install " | grep -v -- "--yes" | sed -r "s/^.*install //". Possui falhas, porque os pacotes removidos também são listados e, se um pacote foi instalado mais de uma vez, é listado várias vezes.
— Lgarzo

1

Não vi nenhuma solução aqui funcionando para mim, instalei alguns pacotes deb com o dpkg e alguns dos itens que estava procurando particularmente estavam ausentes.

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 $2 }' > $DPKG_INITIAL ; awk '$3 !~ /install|remove|purge/ { next } { gsub(/remove|purge/, "uninstall", $3) ; gsub(/:.+/, "", $4) ; a[$4]=$3 } 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 $1 | 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 no seu diretório de trabalho atual chamado my-packages.

Explicação

Primeiro criei 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 $2 }' > initial

Seguido por uma longa lista de itens instalados em geral.

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

Em seguida, comparei os dois arquivos initiale installedliste apenas os itens exclusivos a serem instalados.

comm -23 installed initial > custom

A partir daí, eu queria filtrar as dependências; é neste ponto que esse método pode perder alguns pacotes desejados; ele desconhece as dependências que também são explicitamente instaladas.

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

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

Depois disso, passei cada linha do meu arquivo custompara esta função com xargs.

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

Depois de ter a longa lista de todas as dependências possíveis (não tenho certeza de todas as declarações possíveis), obtive novamente 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 manualdisponível para revisão.


0

Alguém vinculado a https://unix.stackexchange.com/questions/3595/ubuntu-list-explicitly-installed-packages/3624#3624 que possui uma boa solução, mas não se comporta corretamente como a saída do aptitude mudou. Aqui está uma versão atualizada, baseada nos pacotes atualmente instalados comparados ao 12.04 LTS. Você precisará aptitudeinstalado, esse é 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, esse bit gera um pacote por linha de tudo o que está instalado no sistema

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

E isso baixa a lista de pacotes padrão e recolhe as informações redundantes.

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

e commcompara os dois arquivos e gera os pacotes que não estão na lista padrão.

comm -23 currentlyinstalled defaultinstalled

Você também pode ir para o outro site e atualizar a resposta lá.
— Martin Ueding

0

Use um arquivo de manifesto de distribuição como o conjunto de pacotes base. Classifique os resultados instalados manualmente em grupos de pacotes por arquitetura e seção, para que seja mais fácil se concentrar em grupos de pacotes (talvez você não se importe com algumas seções).

https://gist.github.com/darrenleeweber/8cc570ff402f19af7fa4

#!/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

Seria fácil modificar os arquivos do pacote para que cada linha seja prefixada apt-get install -y e o arquivo seja um script bash. Todos os arquivos do pacote podem ser incluídos em um loop de provisão vagante.
— Darren Weber

0
#! /bin/sh
DEFAULT=`tempfile`
CURRENT=`tempfile`
cat /var/log/installer/initial-status.gz | gzip -d | grep '^Package:' | awk '{ print $2}' | sort -u > $DEFAULT
aptitude search '~i !~M' -F '%p' | sort -u | tr -d ' ' | awk '{ print $1}' > $CURRENT
comm -23 $CURRENT $DEFAULT
rm $DEFAULT
rm $CURRENT

0

Não encontrei um que fosse adequado para mim, então escrevi um roteiro. Analisando o conteúdo de /var/log/apt/history.log* e / var / log / aptitude, classifique por data e hora, resultando em duas listas: uma é a instalação manual dos pacotes, a outra é instalada, mas os pacotes são removidos. Script com verificação 'apt list'. um pequeno desvio, porque o uso do dpkg instalou e modificou a fonte PPA.

Coloquei aqui, https://github.com/eexpress/eexp-bin/blob/master/self-installed-pkg.pl .

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


O que é essa captura de tela ilegível do muro de texto?
— Muru

É a minha saída de script. Mas hoje acho que o dnf do Fedora é mais eficaz. "dnf history" mostra um histórico puro da operação de pacotes.
— eexpress utópico

0

Eu acho que você deseja usar /var/log/apt/history.loge 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 da fonte )

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

Ele obtém os arquivos compactados nos antigos history.loge os adiciona com a corrente history.loge passa pelo grep, extraindo linhas com o apt [-get] install [e / ou reinstalar] e mostrando o restante da linha (sinalizador -o) que equivale ao nome (s) do pacote.

Isso precisará de um pouco de modificação (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 synapticou kdesudo synaptic) na seção "status" possui uma lista "instalada (manualmente)". Se você marcar a lista inteira para remoção [não a aplique !!], poderá salvar as alterações marcadas e obter uma lista de pacotes dessa maneira. Cuidado: isso está bloqueado synapticpara mim (calculando as remoções de dependência presumivelmente).


Copiado da minha resposta em outro lugar.
— pbhj
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.