Gerando lista de pacotes instalados manualmente e consultando pacotes individuais

138

Gostaria de obter uma lista de pacotes instalados manualmente por apt ou aptitude e ser capaz de descobrir se um pacote foobar foi instalado manualmente ou automaticamente. Existe alguma maneira legal de fazer isso a partir da linha de comando?

    
por Umang 16.08.2010 / 19:07

12 respostas

154

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 (6 de julho de 2014) nesta questão.

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 estão perdidos, embora eu suspeite que esses sejam realmente instalados pelo usuário, logo após a instalação, por meio da configuração de localização de idioma ou, por exemplo, através do instalador do codec Totem. Além disso, as versões do cabeçalho do 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 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 imprima as linhas no arquivo 1 que não estão presentes no arquivo 2.

Outras possibilidades também não funcionam:

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

Eu usei várias outras postagens do StackExchange como referências, mas nenhuma funciona tão bem quanto a solução acima:

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

EDIT: O que fazer se você fez upgrade de uma versão anterior:

Se você atualizou o Ubuntu de um lançamento para o outro, provavelmente precisará ajustar esse processo. Nesse caso, eu verificaria o arquivo de manifesto da versão mais recente (veja acima) além do arquivo initial-status.gz da versão atual. Você pode facilmente fazer isso apenas adicionando outra comparação. Usar apenas o arquivo de manifesto não funcionará, pois o arquivo de manifesto infelizmente não contém tudo o que o arquivo initial_status.gz faz (eu verifiquei).

    
por jmiserez 06.07.2014 / 17:01
49

Em versões mais recentes do pacote apt, existe também o comando apt-mark

apt-mark showmanual
    
por Daniel Alder 17.05.2012 / 18:21
19

apt-mark showauto | grep -iE '^foobar$' produzirá "foobar" se o pacote foi instalado automaticamente, nada em contrário.

aptitude search '!~M ~i' listará os pacotes que não foram instalados automaticamente. É uma pena que o aptitude não faça parte da instalação padrão no Ubuntu Desktop a partir de 10.10.

    
por Li Lo 16.08.2010 / 19:32
8

O seguinte script irá imprimir todos os pacotes que não estão configurados para instalação automática e, portanto, foram instalados manualmente:

#!/usr/bin/python

try:
    import apt_pkg
except ImportError:
    print "Error importing apt_pkg, is python-apt installed?"
    sys.exit(1)

apt_pkg.init()
STATE_FILE = apt_pkg.config.find_dir("Dir::State") + "extended_states"
auto = set()
tagfile = apt_pkg.TagFile(open(STATE_FILE))
while tagfile.step():
    pkgname = tagfile.section.get("Package")
    autoInst = tagfile.section.get("Auto-Installed")
    if not int(autoInst):
        auto.add(pkgname)
print "\n".join(sorted(auto))

é baseado em como o apt-mark imprime os pacotes instalados automaticamente.

    
por txwikinger 16.08.2010 / 21:42
8

Para o Ubuntu 16.04, confira o arquivo de log /var/log/apt/history.log .

Por exemplo:

zgrep 'Commandline: apt' /var/log/apt/history.log /var/log/apt/history.log.*.gz

Não é perfeito, mas é muito bom para deixar claro exatamente o que eu instalei à mão. Coloque um -B 1 no grep para ver quando foi instalado.

Exemplo de saída

Commandline: apt install postgresql-9.5-plv8
Commandline: aptdaemon role='role-install-file' sender=':1.85'
Commandline: apt install task
Commandline: apt autoremove
Commandline: apt install atom
Commandline: apt upgrade
Commandline: apt-get install asciinema
Commandline: apt install iperf3
Commandline: apt upgrade
Commandline: apt-get install chromium-browser
Commandline: apt install joe cpanminus build-essential postgresql libdbd-pg-perl libcrypt-openssl-bignum-perl libcrypt-openssl-rsa-perl libio-socket-ssl-perl libnet-ssleay-perl libssl-dev
Commandline: aptdaemon role='role-commit-packages' sender=':1.2314'
Commandline: apt install git
Commandline: apt install sqlite
Commandline: apt install whois
Commandline: apt install libdbd-pg-perl
Commandline: apt install perl-doc
Commandline: apt upgrade

Não tenho certeza se isso pega aptitude ou não. Não parece pegar instalações do aplicativo de desktop Ubuntu Software.

    
por s1037989 04.02.2017 / 19:48
4

Como várias pessoas comentaram, o apt-mark showmanual parece ser um pouco buggy (e eu o relatei como bug 727799 ). Quando eu estou usando, ele realmente reporta um monte de coisas que não estão nem logadas em / var / lib / apt / extended_states (onde isto deveria ser armazenado) e o apt-get não está registrando coisas como instaladas em / var / lib / apt / extended_states (apenas em / var / lib / dpkg / status). O script python do txwikinger acima desenha diretamente de / var / lib / apt / extended_states, mas se você estiver usando hoje a sintaxe pode não funcionar (a minha acabou de gerar erros com o Kubuntu 13.10). A sintaxe atualizada é:

#!/usr/bin/python
import sys

try:
    import apt_pkg
except ImportError:
    print "Error importing apt_pkg, is python-apt installed?"
    sys.exit(1)

apt_pkg.init()
STATE_FILE = apt_pkg.config.find_dir("Dir::State") + "extended_states"
auto = set()
tagfile = apt_pkg.TagFile(open(STATE_FILE))
while tagfile.step():
    pkgname = tagfile.section.get("Package")
    autoInst = tagfile.section.get("Auto-Installed")
    if not int(autoInst):
        auto.add(pkgname)
print "\n".join(sorted(auto))

Para mim, esta foi uma lista muito pequena de 5 itens que também não parecem ser precisos.

    
por cluelesscoder 27.10.2013 / 01:28
4

Para obter uma lista de todos os pacotes (não instalados, instalados pelo usuário ou instalados por padrão, em todos os PPAs), apt emprega o seguinte método:

apt list [option]

As opções possíveis úteis para isso são:

--installed para exibir apenas os pacotes instalados no sistema (de mais de 50.000 +)

--manual-installed para listar os pacotes que foram explicitamente instalados por um comando, diretamente ou como dependências.

Como alternativa, você pode fazer:

apt list --manual-installed | grep -F \[installed\] para obter uma lista de pacotes que resultam de comandos do usuário e suas dependências apenas, e para obter informações adicionais sobre eles, como versão e arquitetura suportadas (x86, x86_64, amd64, todos, etc.)

    
por Aalok 07.02.2017 / 15:01
2

Depois de pesquisar muito, consegui montar esse script. Funciona bem para mim:

# List of all packages currently installed
current=$(dpkg -l | awk '{print }' | sort | uniq)

# List of all packages that were installed with the system
pre=$(gzip -dc /var/log/installer/initial-status.gz | sed -n 's/^Package: //p' | sort | uniq)

# List of packages that don't depend on any other package
manual=$(apt-mark showmanual | sort | uniq)

# (Current - Pre) ∩ (Manual)
packages=$(comm -12 <(comm -23 <(echo "$current") <(echo "$pre")) <(echo "$manual") )

for pack in $packages; do
    packname=$(echo $pack | cut -f 1 -d ":")
    desc=$(apt-cache search "^$packname$" | sed -E 's/.* - (.*)//')
    date=$(date -r /var/lib/dpkg/info/$pack.list)

    echo "# $desc"
    echo "# $date"
    echo "sudo apt-get install $pack"
    echo -e ""
done
    
por dufferZafar 31.05.2015 / 22:28
1

Como Li Lo disse, apt-mark showauto deveria te trazer uma lista de coisas automaticamente instaladas.

Agora, para mostrar as coisas que são instaladas manualmente, há um adorável modificador de pesquisa simples para o aptitude. Mas você não quer fazer isso. Você quer escrever um enorme comando bash que faz alguma ciência de foguetes.

Nota: Isso é mais uma ilustração de como você vai parecer legal com todos os seus amigos.

comm -3  <(dpkg-query --show -f '${Package} ${Status}\n' | \n
grep "install ok installed" | cut --delimiter=' ' -f 1) <(apt-mark showauto)

Eu quebrei em duas linhas para facilitar a leitura. O que isso faz?

  • Primeiro, consultamos o dpkg para obter uma lista de pacotes instalados.
  • Filtramos os que estão realmente instalados (não apenas a configuração residual)
  • Cortamos o status
  • Comparamos essa lista com a lista automatizada de apt-mark
  • Nós agitamos porque podemos.
por Oli 16.08.2010 / 19:41
1

Se ninguém lhe der uma boa resposta usando um comando apr-something, você pode fazê-lo da maneira mais difícil . O Apt-get armazena suas informações em / var / lib / apt / extended_states. Qualquer arquivo instalado automaticamente será adicionado a este arquivo. Se você instalar um pacote já neste arquivo manualmente, o pacote permanecerá nesse arquivo, mas com o Auto-instalado: 0 na segunda linha. Não é excluído.

Observação: conforme esperado, as melhores respostas provavelmente funcionarão se as alterações na veiculação de arquivos tiverem aparecido. Eu mantenho o meu apenas no caso da informação sobre a localização do arquivo é útil.

    
por Javier Rivera 16.08.2010 / 19:44
0

Gostaria de fornecer uma solução de GUI.

  1. Abrir Synaptic Package Manager

  2. Ir para Status

  3. Clique em Installed (manual)

Ele dará a lista de pacotes instalados manualmente pelo apt ou aptitude.

Infelizmente, não encontrei nenhuma opção em Custom Filters para descobrir se um pacote foobar foi instalado manualmente ou automaticamente.

Se o pacote estiver em Installed , mas não abaixo de Installed (manual) , ele será Instalado automaticamente. Se o pacote estiver em Installed (manual) , ele foi instalado manualmente.

    
por blueray 28.05.2018 / 17:39
-1

Isso listará todos os pacotes instalados manualmente sem: dependências, pacotes desinstalados, pacotes instalados durante a instalação do sistema.

unopts() {
  in='cat'
  echo "$in" | sed -r 's/ --[^ ]+//g;s/ -[^ ]+//g'
}

list() {
  cat '/var/log/apt/history.log' |
  grep --color=never -v '\-o APT::Status-Fd=4 \-o APT::Keep-Fds::=5 \-o APT::Keep-Fds::=6' |
  egrep --color=never "Commandline: apt-get.* " |
  sed -r "s/Commandline: apt-get//;s/ //" |
  unopts |
  tr ' ' '\n' |
  sed '/^$/d'
}

hapt() {
  tmp='mktemp -d'
  installed=$tmp/installed
  deleted=$tmp/deleted
  dpkg=$tmp/dpkg
  list 'install' > $installed
  list '(remove|purge|autoremove)' > $deleted
  dpkg --get-selections |
  grep -v 'deinstall' |
  cut -f 1 > $dpkg
  while read package
  do
    sed -i "0,/$package/{//d;}" $installed
  done < $deleted
  while read package
  do
    if [ -z "'grep --color=never "^$package$" $dpkg'" ]
    then
      sed -i "0,/$package/{//d;}" $installed
    fi
  done < $installed
  cat $installed
  rm -r $tmp
}
    
por wieczorek1990 08.10.2014 / 15:39