Come posso elencare i pacchetti installati per data di installazione?
Ho bisogno di farlo su debian / ubuntu. Anche le risposte per altre distribuzioni sarebbero carine.
Ho installato molte cose per compilare un certo pezzo di codice e voglio ottenere un elenco dei pacchetti che ho dovuto installare.
Commenti
- Vedi anche Come ottenere la cronologia di apt-get install .
- Stavo cercando su Google la ” data di rilascio di apt ” senza fortuna, forse questo commento aiuterà i futuri googler.
- Domanda simile a askubuntu.com ” Come elencare tutti i pacchetti installati ” .
Risposta
Le distribuzioni basate su RPM come Red Hat sono facili:
rpm -qa --last
Su Debian e altre distribuzioni basate su dpkg, anche il tuo problema specifico è facile:
grep install /var/log/dpkg.log
A meno che il file di registro non sia stato ruotato, nel qual caso dovresti provare:
grep install /var/log/dpkg.log /var/log/dpkg.log.1
In generale, dpkg
e apt
non sembrano tenere traccia della data di installazione, data la mancanza di tali campi nella dpkg-query
pagina man.
E alla fine i vecchi file /var/log/dpkg.log.*
verranno eliminati dalla rotazione del log, quindi non è così ” Non ti garantisco di darti lintera cronologia del tuo sistema.
Un suggerimento che appare alcune volte (es questo thread ) è quello di esaminare la directory /var/lib/dpkg/info
. I file lì suggeriscono che potresti provare qualcosa del tipo:
ls -t /var/lib/dpkg/info/*.list | sed -e "s/\.list$//" | head -n 50
Per rispondere alla tua domanda sulle selezioni, ecco “un primo passaggio.
crea lelenco dei pacchetti per data
$ 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
crea lelenco dei pacchetti installati
$ dpkg --get-selections | sed -ne "/\tinstall$/{s/[[:space:]].*//;p}" | \ sort > ~/dpkglist.selections
unisciti ai 2 elenchi
$ join -1 1 -2 1 -t $"\t" ~/dpkglist.selections ~/dpkglist.dates \ > ~/dpkglist.selectiondates
Per qualche motivo ” non stampa molte differenze per me, quindi potrebbe esserci un bug o un presupposto non valido su cosa significa --get-selections
.
Puoi ovviamente limitare i pacchetti sia utilizzando find . -mtime -<days>
o head -n <lines>
e modifica il formato di output come preferisci, ad esempio
$ 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
per elencare solo le selezioni installate (modificate?) negli ultimi 4 giorni.
Probabilmente potresti anche rimuovere i comandi sort
dopo aver verificato lordinamento utilizzato da dpkg --get-selections
e impostare find
comando più efficiente.
Commenti
- Di solito mi piace
apt-get
più dirpm
, ma ora debian ottiene -1 per non aver salvato la data di installazione nel database. Il trucco Debian include tutti i pacchetti installati, non solo i pacchetti selezionati , ma ‘ un buon inizio. - Per Debian tu ottieni meno cruft (rimuove le voci
half-installed
) se lo fai:grep install\ /var/log/dpkg.log
- @Mikel – Ottima risposta. Ho ampliato le ‘ raccogliere /var/lib/dpkg/info/*.list informazioni sul file ‘ e ho aggiunto il codice per filtrare tutto ma i ” pacchetti di primo livello ” (pacchetti atp da cui nessun altro pacchetto atp dipende). Quel < askubuntu.com/a/948532/723997> post risponde alla domanda ” Come posso visualizzare la cronologia dei comandi di apt-get install che ho eseguito manualmente? “.
- Debian / Ubuntu:
grep " install " /var/log/dpkg.log
elenca solo le righe di “installazione” invece di mostrare anche quelle di “stato”. - Se né apt né dpkg store installano / modificano datetime, questo mi sembra piuttosto inaccettabile nel 2019. Abbiamo fatto affidamento su file di log grepping che potrebbero o non essere ancora sulla macchina? Comè questo il caso?
Risposta
Mikel ha mostrato come farlo a livello di dpkg . In particolare, /var/lib/dpkg/info/$packagename.list
viene creato quando il pacchetto viene installato (e non modificato in seguito).
Se hai utilizzato gli strumenti APT (cosa che presumibilmente hai fatto da quando ” sei preoccupato per i pacchetti installati automaticamente rispetto a quelli installati manualmente), cè “una cronologia in /var/log/apt/history.log
. Finché non viene ruotato, tiene traccia di tutte le installazioni, aggiornamenti e rimozioni di APT, con unannotazione per i pacchetti contrassegnati come installati automaticamente. Questa è una caratteristica abbastanza recente, introdotta in APT 0.7.26, quindi in Debian è apparso in squeeze. In Ubuntu, 10.04 contiene history.log
ma lannotazione installata automaticamente non è presente fino al 10.10.
Commenti
- As Mikel ha sottolineato: ” E alla fine i vecchi file /var/log/dpkg.log.* verranno eliminati dalla rotazione del log, quindi in questo modo non ‘ garantisce di darti lintera cronologia del tuo sistema. “. Visualizza questo < askubuntu.com/a/948532/723997 > risposta su come rilevare gli attuali pacchetti di primo livello (ovvero quelli da cui nessun altro pacchetto dipende)
Risposta
Ruvido, ma funziona:
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
Commenti
- Boo, sibilo per lanalisi delloutput da
ls
. Vedi mywiki.wooledge.org/ParsingLs per note sul motivo per cui questo è pericoloso / intrinsecamente difettoso: lopzione più sicura è utilizzarefind -printf
ostat --format
per generare uno stream che può essere analizzato in modo univoco. - @CharlesDuffy Bel collegamento, ma per motivi di semplicità, utilizzando
ls -al --time-style=long-iso
dovrebbe essere utile. Inoltre, è probabilmente inaudito che qualcuno possa chiamare un pacchetto APT con\n\t\r\v
nel nome.
Risposta
Ecco la frase che tutti vogliono e di cui hanno bisogno:
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
Il risultato mostrerà tutti i pacchetti installati e aggiornati (appena) in ordine cronologico.
La spiegazione della riga:
-
ls -1t
– ottieni tutti idpkg.log*
nomi di file in ordine cronologico -
zcat -f
– SE file è di tipo gzip quindi decomprimilo, ELSE si limita a trasmettere il contenuto. -
tac
– Uscita inversa di cat , riga per riga per assicurarci di ottenere lordine cronologico corretto. -
grep
– Controlla solo installato o aggiorna i pacchetti. -
awk -F ":a"
– Separa il campo architettura dal nome del pacchetto -
column -t
– stampa carina le colonne separate da spazio
Si vorrebbe ovviamente creare un alias per questo, ma sfortunatamente non è possibile in quanto awk dipende sia da single che da virgolette. A questo proposito, è meglio inserirlo in uno script bash e dove il separatore :
viene gestito meglio per altre architetture nella colonna del campo.
Loutput è:
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
Svantaggio:
- Come mostrato sopra, funziona solo su architettura ARM e necessita di una leggera modifica per il separatore di campo dellarchitettura
- Deve essere inserito in uno script per un facile alias
- Non è stato testato su altri sistemi * nix
Risposta
Il file /var/log/apt/history.log
ha un formato scomodo IMHO.
Data di inizio: {date} {ora } Riga di comando: {comando} {opzioni …} Installa: {pacchetto (versione)}, …, {pacchetto (versione)}, … Data di fine: {date} {ora}
Avrei preferito un record formattato come file di log
{date} {time} {tab} {package} {tab} {version} {tab} {command} {options} \ n
o un codice XML che mostra non solo un { package} ma qualsiasi {dipendenze}.
Come attualmente implementato, c e scoprire le informazioni che cerchi, ma per estrarre i dettagli è necessaria unelaborazione forense.
Risposta
Questo funziona per me su un Sistema Debian, immagino che il formato del file sia cambiato dal 2011. Questo sistema è abbastanza nuovo quindi non mi aspetterei che funzioni su un sistema più vecchio, anche se ciò potrebbe richiedere solo la decompressione dei log e luso di un glob per fare riferimento a tutti di loro.
grep "install " /var/log/dpkg.log.1 | sort | cut -f1,2,4 -d" "
I primi due campi in ogni riga del file /var/log/dpkg.log
sono la data e lora. Nota lo spazio finale con install nella parte grep, questo perché gli aggiornamenti possono attivare le installazioni, ma se ho capito bene volevi sapere cosa è stato installato dagli utenti.
Commenti
- Esattamente quello che faccio. Facile. Ma puoi usare zgrep e tutti i tuoi log .gz verranno cercati come zgrep ‘ install ‘ /var/log/dpkg.log *.Posiziona lo spazio prima della parola ” install ” per evitare quelle fastidiose ” mezze installazioni “. Ho dovuto usare cut -f1,5 per ottenere il campo del nome del pacchetto. Ovviamente alla fine i vecchi log ruotano fuori.
Risposta
GNU / Linux Debian non ha strumenti integrati per questo problema, ma tutte le informazioni sui programmi installati nel modalità standard vengono salvate in file con nome-programma. list nella posizione / var / lib / dpkg / info / . Ma non sono disponibili informazioni sui programmi installati manualmente.
Una soluzione a riga singola lunga :
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
Spiegazione :
-
ls -rt
restituisce file ordinati per modifica della data in ordine inverso, ie con i file più recenti alla fine dellelenco. -
stat
stampa il file “s data in formato leggibile. -
printf
mostra il nome del pacchetto e la data della sua ultima modifica. - Il
for
il ciclo nel suo insieme stampa i nomi dei pacchetti e le date dal più vecchio al più recente.
Esempio di output (troncato):
......................................... 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
Il difetto principale di questa soluzione è che “non è ben testato nel prodotto ion.
Commenti
- Questa è una bella soluzione che porta quasi a termine il lavoro. Gli unici inconvenienti sono ‘, che (1) è ‘ molto lento e (2) che viene visualizzato solo quando un pacchetto è stato aggiornato lultima volta , nessuna delle versioni precedenti di ‘. Questo, ovviamente, non è un problema di una riga, ma come dpkg non ‘ tiene traccia della cronologia in
/var/lib/dpkg/info/
. Questo è anche il motivo per cui potrebbe essere preferibile utilizzare/var/log/dpkg.log*
.
Risposta
Notando questo perché dici che altre risposte di distribuzione sono benvenute. rpm ha un ampio set di tag per il formato di output, uno dei quali è INSTALLTIME. (Usando wget
come esempio)
rpm -qi wget --qf "%{NAME},%{INSTALLTIME}\n" | tail -n 1 wget,1454014156
Questo può essere formattato in diversi modi. Lo uso in questo modo:
rpm -qi wget --qf "%{NAME},%{INSTALLTIME:date}\n" | tail -n 1 wget,Thu 28 Jan 2016 03:49:16 PM EST
Queste due pagine contengono un sacco di ottime informazioni sulla risoluzione dei problemi relativi ai metadati RPM:
http://www.rpm.org/max-rpm/s1-rpm-query-parts.html
http://www.rpm.org/max-rpm/s1-rpm-query-handy-queries.html
Ordinare queste informazioni fornirebbe una soluzione funzionante per il tuo problema.
Risposta
È approssimativo, ma funziona velocemente come altre soluzioni. Il formato della data è aaaammgghhmmss, il che significa che un po o il riordino e la rimozione del formato danno come risultato un numero che può essere ordinato.
Molte grazie alle altre soluzioni, questo elenca i nomi dei pacchetti in ordine di installazione che potrebbero essere usati in un sistema operativo creato per copiare.
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}"
Commenti
- Benvenuto @ alexander-cave! Aggiungi alcune righe di output in modo che le persone possano vedere che tipo di output aspettarsi.
Risposta
Con i file di log ruotati in apt puoi:
zcat -f /var/log/dpkg.log* | grep " install " | less
Answer
Lho ottenuto su Kubuntu con i seguenti comandi:
- Elenca i pacchetti.
- leggi ogni input standard.
- memorizza lintero percorso (percorso | data di creazione) con il formato “% n |% y ” in una variabile.
- memorizza il nome del file in una variabile
- se entrambi i comandi precedenti sono stati eseguiti correttamente, i valori verranno stampati in una singola riga.
ls /var/lib/dpkg/info/*.list |while read xfile; do wpath=$(stat -c "%n|%y" ${xfile}) && wfile=$(basename ${xfile}) && printf "${wfile}|${wpath}\n" ;done
Cordiali saluti,