Listar pacotes em um sistema baseado em apt por data de instalação

Como posso listar os pacotes instalados por data de instalação?

Eu preciso fazer isso no debian / ubuntu. Respostas para outras distribuições também seriam boas.

Eu instalei um monte de coisas para compilar um determinado trecho de código e quero obter uma lista dos pacotes que tive que instalar.

Comentários

Resposta

Distribuições baseadas em RPM como Red Hat são fáceis:

rpm -qa --last 

No Debian e outras distribuições baseadas em dpkg, seu problema específico também é fácil:

grep install /var/log/dpkg.log 

A menos que o arquivo de registro tenha sido girado, nesse caso você deve tentar:

grep install /var/log/dpkg.log /var/log/dpkg.log.1 

Em geral, dpkg e apt não parecem rastrear a data de instalação, passando pela falta de tal campo no Página do manual dpkg-query.

E, eventualmente, os arquivos /var/log/dpkg.log.* antigos serão excluídos pela rotação do log, de modo que não ” t garantido para lhe dar todo o histórico do seu sistema.

Uma sugestão que aparece algumas vezes (por exemplo este tópico ) é olhar para o diretório /var/lib/dpkg/info. Os arquivos lá sugerem que você pode tentar algo como:

ls -t /var/lib/dpkg/info/*.list | sed -e "s/\.list$//" | head -n 50 

Para responder à sua pergunta sobre as seleções, aqui está uma primeira tentativa.

lista de construção de pacotes por datas

$ find /var/lib/dpkg/info -name "*.list" -exec stat -c $"%n\t%y" {} \; | \ sed -e "s,/var/lib/dpkg/info/,," -e "s,\.list\t,\t," | \ sort > ~/dpkglist.dates 

lista de construção de pacotes instalados

$ dpkg --get-selections | sed -ne "/\tinstall$/{s/[[:space:]].*//;p}" | \ sort > ~/dpkglist.selections 

junte-se às 2 listas

$ join -1 1 -2 1 -t $"\t" ~/dpkglist.selections ~/dpkglist.dates \ > ~/dpkglist.selectiondates 

Por algum motivo, ” não está mostrando muitas diferenças para mim, então pode haver um bug ou uma suposição inválida sobre o que --get-selections significa.

Você pode obviamente limitar os pacotes por usando find . -mtime -<days> ou head -n <lines> e altere o formato de saída como desejar, por exemplo,

$ find /var/lib/dpkg/info -name "*.list" -mtime -4 | \ sed -e "s,/var/lib/dpkg/info/,," -e "s,\.list$,," | \ sort > ~/dpkglist.recent $ join -1 1 -2 1 -t $"\t" ~/dpkglist.selections ~/dpkglist.recent \ > ~/dpkglist.recentselections 

para listar apenas as seleções que foram instaladas (alteradas?) nos últimos 4 dias.

Você provavelmente também poderia remover os comandos sort depois de verificar a ordem de classificação usada por dpkg --get-selections e faça o find comando mais eficiente.

Comentários

  • Eu geralmente gosto de apt-get mais do que rpm, mas agora o debian recebe -1 por não salvar a data de instalação no banco de dados. O truque do debian inclui todos os pacotes instalados, não apenas os pacotes selecionados , mas é ‘ um bom começo.
  • Para o Debian, você obtenha menos cruft (remove half-installed entradas) se você fizer: grep install\ /var/log/dpkg.log
  • @Mikel – Ótima resposta. Expandi ‘ reúna /var/lib/dpkg/info/*.list informações do arquivo ‘ e adicionei código para filtrar todos mas os ” pacotes de nível superior ” (pacotes atp dos quais nenhum outro pacote atp depende). Essa < askubuntu.com/a/948532/723997> postagem responde à pergunta ” Como posso ver o histórico dos comandos apt-get install que executei manualmente? “.
  • Debian / Ubuntu: grep " install " /var/log/dpkg.log lista apenas as linhas “instalar” em vez de mostrar as linhas de “status” também.
  • Se nem o apt nem o dpkg armazenam data / hora de instalação / modificação, isso parece bastante inaceitável para mim em 2019. Temos confiado em arquivos de log de grep que podem ou não estar ainda na máquina? Como é esse o caso?

Resposta

Mikel mostrou como fazer isso no nível do dpkg . Em particular, /var/lib/dpkg/info/$packagename.list é criado quando o pacote é instalado (e não modificado depois).

Se você usou as ferramentas APT (o que provavelmente fez desde que você ” está preocupado com pacotes instalados automaticamente ou manualmente), há “um histórico em /var/log/apt/history.log. Contanto que não tenha girado, ele mantém registro de todas as instalações, atualizações e remoções do APT, com uma anotação para os pacotes marcados como instalados automaticamente. Este é um recurso bastante recente, introduzido no APT 0.7.26, então no Debian ele apareceu no squeeze. No Ubuntu, 10.04 tem history.log, mas a anotação instalada automaticamente não está presente antes de 10.10.

Comentários

  • Como Mikel apontou: ” E, eventualmente, os arquivos /var/log/dpkg.log.* antigos serão excluídos pela rotação do log, de modo que não ‘ t garantido para fornecer a você todo o histórico de seu sistema. “. Veja este < askubuntu.com/a/948532/723997 > resposta sobre como detectar os pacotes de nível superior atuais (ou seja, aqueles dos quais nenhum outro pacote depende)

Resposta

Áspero, mas funciona:

for fillo in `ls -tr /var/lib/dpkg/info/*.list` ; do basename ${fillo} | sed "s/.list$//g" ; done > forens.txt ls -ltr /var/lib/dpkg/info/*.list > forentime.txt for lint in `cat forens.txt` ; do echo -n "[ ${lint} Installed ] : " ; echo -n "`grep /${lint}.list forentime.txt | awk "{ print $6, $7, $8 }"` : " ; ( ( grep -A3 " ${lint}$" /var/lib/apt/extended_states | \ grep "^Auto" > /dev/null ) && echo "Auto" ) || echo "Manual" ; done > pkgdatetime.txt 

Comentários

  • Buu, assobio para analisar a saída de ls. Consulte mywiki.wooledge.org/ParsingLs para obter notas sobre por que isso é perigoso / inerentemente bugado – a opção mais segura é usar find -printf ou stat --format para gerar um fluxo que pode ser analisado sem ambigüidade.
  • @CharlesDuffy Link legal, mas para fins de simplicidade, usando ls -al --time-style=long-iso deve ser útil. Além disso, provavelmente não se ouviu falar que alguém nomearia um pacote APT com \n\t\r\v em seu nome.

Resposta

Aqui está a frase que todos desejam e precisam:

 for x in $(ls -1t /var/log/dpkg.log*); do zcat -f $x |tac |grep -e " install " -e " upgrade "; done |awk -F ":a" "{print $1 " :a" $2}" |column -t  

O resultado mostrará todos os pacotes (recentemente) instalados e atualizados em ordem cronológica.

A explicação da linha:

  • ls -1t – obtenha todos os dpkg.log* nomes de arquivo em ordem cronológica
  • zcat -f SE o arquivo for do tipo gzip e descompactá-lo, ELSE apenas passe o conteúdo.
  • tac – Saída reversa de cat , linha por linha para ter certeza de obter a ordem cronológica correta.
  • grep – Verifique apenas se há instalado ou atualizar pacotes.
  • awk -F ":a" – Separe o campo arquitetura do nome do pacote
  • column -t – imprima bem as colunas separadas por espaço

É claro que gostaria de fazer um apelido para isso, mas infelizmente não é possível, pois awk depende tanto de single quanto aspas duplas. Nesse sentido, é melhor colocá-lo em um script bash e onde o : separador é tratado melhor para outras arquiteturas na coluna de campo.

O resultado é:

2018-03-06 18:09:47 upgrade libgomp1 :armhf 6.3.0-18+rpi1 6.3.0-18+rpi1+deb9u1 2018-03-05 15:56:23 install mpg123 :armhf <none> 1.23.8-1 2018-03-05 15:56:23 install libout123-0 :armhf <none> 1.23.8-1 2018-01-22 17:09:45 install libmailtools-perl :all <none> 2.18-1 2018-01-22 17:09:44 install libnet-smtp-ssl-perl :all <none> 1.04-1 

Desvantagem:

  • Como mostrado acima, só funciona na arquitetura ARM e precisa de pequenas modificações no separador de campo da arquitetura
  • Precisa ser colocado em um script para alias fácil
  • não foi testado em outros sistemas * nix

Resposta

O arquivo /var/log/apt/history.log tem um formato estranho IMHO.

Data de início: {date} {hora } Linha de comando: {command} {options …} Install: {package (version)}, …, {package (version)}, … End-Date: {date} {time}

Eu teria preferido um registro com formato de arquivo de log mais formatado

{date} {time} {tab} {package} {tab} {version} {tab} {command} {options} \ n

ou algum XML mostrando não apenas um { pacote}, mas qualquer {dependências}.

Conforme implementado atualmente, você c e descubra as informações que você procura, mas requer algum processamento forense para extrair os detalhes.

Resposta

Isso funciona para mim em um Sistema Debian, estou supondo que o formato do arquivo mudou desde 2011. Este sistema é muito novo, então eu não esperava que funcionasse em um sistema mais antigo, embora isso possa exigir apenas a descompactação dos logs e o uso de um glob para se referir a todos deles.

grep "install " /var/log/dpkg.log.1 | sort | cut -f1,2,4 -d" " 

Os primeiros dois campos em cada linha do arquivo /var/log/dpkg.log são a data e a hora. Observe o espaço à direita com instalação na parte grep, isso ocorre porque as atualizações podem acionar instalações, mas se entendi corretamente, você queria saber o que foi instalado pelos usuários.

Comentários

  • Exatamente o que eu faço. Fácil. Mas você pode usar zgrep e todos os seus registros .gz serão pesquisados como zgrep ‘ install ‘ /var/log/dpkg.log *.Coloque o espaço antes da palavra ” install ” para evitar aquelas ” meias-instalações desagradáveis “. Tive que usar cut -f1,5 para obter o campo de nome do pacote. Claro, eventualmente, os registros antigos serão removidos.

Resposta

GNU / Linux Debian não possui ferramentas integradas para este problema, mas todas as informações sobre programas instalados na forma padrão são salvas em arquivos com nome do programa. lista no local / var / lib / dpkg / info / . Mas não há informações sobre programas instalados manualmente lá.


Uma solução longa de linha única :

for file_list in `ls -rt /var/lib/dpkg/info/*.list`; do \ stat_result=$(stat --format=%y "$file_list"); \ printf "%-50s %s\n" $(basename $file_list .list) "$stat_result"; \ done 

Explicação :

  1. ls -rt arquivos de saídas classificados por modificação de data na ordem inversa, isto é, com os arquivos mais recentes no final da lista.
  2. stat imprime o arquivo “s data em formato legível por humanos.
  3. printf exibe o nome do pacote e a data de sua última modificação.
  4. O for loop como um todo imprime nomes de pacotes e datas do mais antigo para o mais recente.

Exemplo de saída (truncado):

......................................... gnome-system-log 2016-09-17 16:31:58.000000000 +0300 libyelp0 2016-09-17 16:32:00.000000000 +0300 gnome-system-monitor 2016-09-17 16:32:00.000000000 +0300 yelp-xsl 2016-09-17 16:32:01.000000000 +0300 yelp 2016-09-17 16:32:03.000000000 +0300 gnome-user-guide 2016-09-17 16:32:18.000000000 +0300 libapache2-mod-dnssd 2016-09-17 16:32:19.000000000 +0300 ......................................... linux-compiler-gcc-4.8-x86 2017-02-26 20:11:02.800756429 +0200 linux-headers-3.16.0-4-amd64 2017-02-26 20:11:10.463446327 +0200 linux-headers-3.16.0-4-common 2017-02-26 20:11:17.414555037 +0200 linux-libc-dev:amd64 2017-02-26 20:11:21.126184016 +0200 openssl 2017-02-26 20:11:22.094098618 +0200 unzip 2017-02-26 20:11:23.118013331 +0200 wireless-regdb 2017-02-26 20:11:23.929949143 +0200 nodejs 2017-02-26 20:11:33.321424052 +0200 nasm 2017-02-28 16:41:17.013509727 +0200 librecode0:amd64 2017-03-01 10:38:49.817962640 +0200 libuchardet0 2017-03-01 10:41:10.860098788 +0200 tree 2017-03-04 14:32:12.251787763 +0200 libtar0 2017-03-07 09:51:46.609746789 +0200 libtar-dev 2017-03-07 09:51:47.129753987 +0200 

O principal defeito desta solução. é que não bem testado no produto íon.

Comentários

  • Esta é uma bela solução que quase conclui o trabalho. São ‘ as únicas desvantagens, são que (1) é ‘ muito lento e (2) que só mostra quando um pacote foi atualizado pela última vez , nenhuma das ‘ versões anteriores. Isso, é claro, não é um problema de uma linha, mas como o dpkg não ‘ mantém registro do histórico em /var/lib/dpkg/info/. É também por isso que usar /var/log/dpkg.log* pode ser preferível.

Resposta

Observando isso porque você mencionou que outras respostas de distribuição são bem-vindas. rpm tem um grande conjunto de tags de formato de saída, uma das quais é INSTALLTIME. (Usando wget como exemplo)

rpm -qi wget --qf "%{NAME},%{INSTALLTIME}\n" | tail -n 1 wget,1454014156 

Isso pode ser formatado de algumas maneiras. Eu o uso desta forma:

rpm -qi wget --qf "%{NAME},%{INSTALLTIME:date}\n" | tail -n 1 wget,Thu 28 Jan 2016 03:49:16 PM EST 

Essas duas páginas têm muitas informações excelentes para resolver problemas de metadados RPM:

http://www.rpm.org/max-rpm/s1-rpm-query-parts.html

http://www.rpm.org/max-rpm/s1-rpm-query-handy-queries.html

Classificar essas informações forneceria uma solução de trabalho para o seu problema.

Resposta

É difícil, mas funciona tão rapidamente quanto outras soluções. O formato de data é aaaammddhhmmss, o que significa que um bit ou reordenação e remoção de formato resulta em um número que pode ser classificado.

Muito graças às outras soluções, esta lista de nomes de pacotes em ordem de instalação que podem ser usados em um sistema operacional criado para copiar.

find /var/lib/dpkg/info -name "*.list" -exec stat -c $"%n\t%y" {} \; \ | sed -e "s,/var/lib/dpkg/info/,," -e "s,\.list\t,\t," \ | sort | awk "{print $2$3" "$1}" | sed "0,/RE/s/-//" \ | sed "0,/RE/s/-//" | sed "0,/RE/s/://" | sed "0,/RE/s/://" \ | sed "0,/RE/s/\\.//" | sed "s/:armhf//" | sort | awk "{print $2}" 

Comentários

  • Bem-vindo @ alexander-cave! Adicione algumas linhas de saída para que as pessoas possam ver que tipo de saída esperar.

Resposta

Com os arquivos de log girados no apt, você pode:

zcat -f /var/log/dpkg.log* | grep " install " | less 

Responder

Eu consegui isso no Kubuntu com os seguintes comandos:

  1. Liste os pacotes.
  2. leia cada entrada padrão.
  3. armazene o completo caminho (caminho | data de criação) com o formato “% n |% y ” em uma variável.
  4. armazene o nome do arquivo em uma variável
  5. se ambos os comandos anteriores foram executados com sucesso, os valores serão impressos em uma única linha.
ls /var/lib/dpkg/info/*.list |while read xfile; do wpath=$(stat -c "%n|%y" ${xfile}) && wfile=$(basename ${xfile}) && printf "${wfile}|${wpath}\n" ;done 

Atenciosamente,

Deixe uma resposta

O seu endereço de email não será publicado. Campos obrigatórios marcados com *