Hvordan kan jeg liste opp installerte pakker etter installasjonsdato?
Jeg må gjøre dette på debian / ubuntu. Svar på andre distribusjoner ville også være fint.
Jeg installerte mange ting for å kompilere et bestemt stykke kode, og jeg vil få en liste over pakkene jeg måtte installere.
Kommentarer
- Se også Slik får du historien om apt-get install .
- Jeg googlet etter » apt utgivelsesdato » uten hell, kanskje denne kommentaren vil hjelpe fremtidige googlere.
- Lignende spørsmål på askubuntu.com » Slik viser du alle installerte pakker » .
Svar
RPM-baserte distribusjoner som Red Hat er enkle:
rpm -qa --last
På Debian og andre dpkg-baserte distribusjoner er det spesifikke problemet også enkelt:
grep install /var/log/dpkg.log
Med mindre loggfilen er rotert, i så fall bør du prøve:
grep install /var/log/dpkg.log /var/log/dpkg.log.1
Generelt ser dpkg
og apt
ikke ut til å spore installasjonsdatoen, med mangel på noe slikt felt i dpkg-query
man-side.
Og til slutt blir gamle /var/log/dpkg.log.*
filer slettet ved loggrotasjon, slik at den måten ikke er » garanterer ikke å gi deg hele historikken til systemet ditt.
Et forslag som vises noen ganger (f.eks denne tråden ) er å se på /var/lib/dpkg/info
-katalogen. Filene der antyder at du kan prøve noe sånt som:
ls -t /var/lib/dpkg/info/*.list | sed -e "s/\.list$//" | head -n 50
For å svare på spørsmålet ditt om valg, er dette et første pass.
byggeliste over pakker etter datoer
$ 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
byggeliste over installerte pakker
$ dpkg --get-selections | sed -ne "/\tinstall$/{s/[[:space:]].*//;p}" | \ sort > ~/dpkglist.selections
bli med i de to listene
$ join -1 1 -2 1 -t $"\t" ~/dpkglist.selections ~/dpkglist.dates \ > ~/dpkglist.selectiondates
Av en eller annen grunn er det » s skriver ikke ut veldig mange forskjeller for meg, så det kan være en feil eller en ugyldig antagelse om hva --get-selections
betyr.
Du kan åpenbart begrense pakkene enten ved å bruker find . -mtime -<days>
eller head -n <lines>
, og endrer utdataformatet slik du vil, f.eks.
$ 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
for å bare vise valgene som ble installert (endret?) de siste 4 dagene.
Du kan sannsynligvis også fjerne sort
kommandoene etter å ha bekreftet sorteringsrekkefølgen som brukes av dpkg --get-selections
og lage find
kommando mer effektiv.
Kommentarer
- Jeg liker vanligvis
apt-get
mer ennrpm
, men nå får debian -1 for ikke å lagre installasjonsdatoen i databasen. Debian-trikset inkluderer alle de installerte pakkene, ikke bare de valgte pakkene, men det ‘ er en god start. - For Debian få mindre cruft (fjerner
half-installed
oppføringer) hvis du gjør:grep install\ /var/log/dpkg.log
- @Mikel – Flott svar. Jeg utvidet meg til ‘ samle /var/lib/dpkg/info/*.list filinformasjon ‘ og la til kode for å filtrere ut alt men » toppnivåpakker » (atp-pakker som ingen andre atp-pakker er avhengige av). At < askubuntu.com/a/948532/723997> innlegg svarer på spørsmålet » Hvordan kan jeg se historikken til apt-get installasjonskommandoer som jeg har utført manuelt? «.
- Debian / Ubuntu:
grep " install " /var/log/dpkg.log
viser bare «installer» -linjene i stedet for å vise «status» også. - Hvis verken apt eller dpkg lagrer installasjon / modifisering av datetid, virker det ganske uakseptabelt for meg i 2019. Vi er avhengige av å gripe loggfiler som kanskje ikke er på maskinen? Hvordan er dette tilfellet?
Svar
Mikel har vist hvordan du gjør dette på dpkg-nivå . Spesielt opprettes /var/lib/dpkg/info/$packagename.list
når pakken er installert (og ikke endret etterpå).
Hvis du brukte APT-verktøyene (som du antagelig gjorde siden du «) er bekymret for automatisk mot manuelt installerte pakker), der «sa historie i /var/log/apt/history.log
. Så lenge den ikke har rotert, holder den oversikt over alle APT-installasjoner, oppgraderinger og fjerninger, med en kommentar for pakker merket som automatisk installert. Dette er en ganske nylig funksjon, introdusert i APT 0.7.26, så i Debian dukket opp i klem. I Ubuntu, 10.04 har history.log
men den automatisk installerte kommentaren er ikke tilstede før 10.10.
Kommentarer
- Som Mikel påpekte: » Og til slutt vil gamle /var/log/dpkg.log.* filer bli slettet ved loggrotasjon, slik at den måten ikke er ‘ t garantert å gi deg hele historikken til systemet ditt. «. Se dette < askubuntu.com/a/948532/723997 > svar for hvordan du oppdager nåværende toppnivåpakker (det vil si de som ingen annen pakke er avhengig av)
Svar
Grovt, men fungerer:
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
Kommentarer
- Boo, sus for å analysere utdata fra
ls
. Se mywiki.wooledge.org/ParsingLs for merknader om hvorfor dette er farlig / iboende buggy – det tryggere alternativet er å bruke entenfind -printf
ellerstat --format
for å generere en strøm som kan tolkes entydig. - @CharlesDuffy Fin kobling, men for enkelhets skyld, bruk
ls -al --time-style=long-iso
bør være nyttig. I tillegg er det sannsynligvis uhørt at noen vil navngi en APT-pakke med\n\t\r\v
i navnet.
Svar
Her er one-liner alle ønsker og trenger:
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
Resultatet viser alle (nylig) installerte og oppgraderte pakker i kronologisk rekkefølge.
Linjeforklaringen:
-
ls -1t
– få alledpkg.log*
filnavn i kronologisk rekkefølge -
zcat -f
– HVIS -filen er av gzip type, dekomprimerer den, ELSE bare gi innholdet videre. -
tac
– Omvendt utdata fra cat , linje for linje for å sikre at vi får riktig kronologisk rekkefølge. -
grep
– Bare sjekk for installert eller oppgrader pakker. -
awk -F ":a"
– Skill arkitektur -feltet fra pakkenavnet -
column -t
– ganske trykk kolonnene atskilt med mellomrom
Man vil selvsagt lage et alias for dette, men dessverre er det ikke mulig som awk avhenger av både singel og doble anførselstegn. I den forbindelse settes dette best i et bash-skript, og der :
separatoren håndteres bedre for andre arkitekturer i feltkolonnen.
Utgangen er:
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
Ulempe:
- Som vist ovenfor, fungerer det bare på ARM-arkitektur og trenger liten modifisering for arkitekturs feltavskiller
- Må settes inn i et skript for enkle alias
- Har ikke blitt testet på tvers av andre * nix-systemer
Svar
/var/log/apt/history.log
filen har et vanskelig format IMHO.
Startdato: {date} {time } Kommandolinje: {kommando} {alternativer …} Installer: {pakke (versjon)}, …, {pakke (versjon)}, … Sluttdato: {dato} {tid}
Jeg hadde foretrukket en mer loggfilformatert post
{date} {time} {tab} {package} {tab} {version} {tab} {command} {options} \ n
eller noe XML som ikke bare viser en { pakke} men eventuelle {avhengigheter}.
Som for øyeblikket implementert, c en oppdage informasjonen du søker, men det krever litt rettsmedisinsk behandling for å hente ut detaljene.
Svar
Dette fungerer for meg på en Debian-system, jeg antar at filformatet har endret seg siden 2011. Dette systemet er ganske friskt, så jeg forventer ikke at dette fungerer på et eldre system, selv om det kanskje bare krever å pakke ut loggene og bruke en glob for å referere til alle av dem.
grep "install " /var/log/dpkg.log.1 | sort | cut -f1,2,4 -d" "
De to første feltene i hver linje i filen /var/log/dpkg.log
er dato og klokkeslett. Legg merke til etterfølgende plass med installasjon i grep-delen, dette er fordi oppgraderinger kan utløse installasjoner, men hvis jeg forsto riktig, ville du vite hva som ble installert av brukerne.
Kommentarer
- Nøyaktig hva jeg gjør. Lett. Men du kan bruke zgrep og alle .gz-loggene dine blir søkt som zgrep ‘ installer ‘ /var/log/dpkg.log *.Plasser mellomrom før ordet » installer » for å forhindre de irriterende » halvinstallasjoner «. Jeg måtte bruke cut -f1,5 for å få navnet på pakkenavnet. Selvfølgelig roterer de gamle loggene til slutt.
Svar
GNU / Linux Debian har ingen innebygde verktøy for dette problemet, men all informasjon om programmer som er installert på standard måte lagres i filer med programnavn. liste på stedet / var / lib / dpkg / info / . Men det er ingen informasjon om manuelt installerte programmer der.
En lang enkeltlinjeløsning :
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
Forklaring :
-
ls -rt
utdata filer sortert etter datoendring i omvendt rekkefølge ie med de nyeste filene på slutten av listen. -
stat
skriver ut filen «s dato i menneskelig lesbar form. -
printf
viser pakkenavnet og datoen for siste endring. -
for
loop som helhet skriver ut pakkenavn og datoer fra eldste til nyeste.
Utdataeksempel (avkortet):
......................................... 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
Hovedfeilen ved denne løsningen er at den ikke er godt testet i produkt ion.
Kommentarer
- Dette er en vakker løsning som får jobben nesten ferdig. Det ‘ er bare ulempene, er at (1) det ‘ er veldig sakte og (2) at det bare vises når en pakke ble sist oppdatert , ikke noe av den ‘ s tidligere versjoner. Dette er selvfølgelig ikke et problem med one-liner, men hvordan dpkg ikke holder ‘ t oversikt over historikken i
/var/lib/dpkg/info/
. Det er også grunnen til at bruk av/var/log/dpkg.log*
kan være å foretrekke.
Svar
Legg merke til dette fordi du nevner at andre distribusjonssvar er velkomne. rpm har et stort sett med koder for utdataformat, hvorav den ene er INSTALLTIME. (Bruker wget
som et eksempel)
rpm -qi wget --qf "%{NAME},%{INSTALLTIME}\n" | tail -n 1 wget,1454014156
Dette kan formateres på noen få måter. Jeg bruker det på denne måten:
rpm -qi wget --qf "%{NAME},%{INSTALLTIME:date}\n" | tail -n 1 wget,Thu 28 Jan 2016 03:49:16 PM EST
Disse to sidene har massevis av flott informasjon om å løse problemer med metadata for RPM:
http://www.rpm.org/max-rpm/s1-rpm-query-parts.html
http://www.rpm.org/max-rpm/s1-rpm-query-handy-queries.html
Sortering av denne informasjonen vil gi deg en fungerende løsning for problemet.
Svar
Det er grovt, men fungerer like raskt som andre løsninger. Datoformat er yyyymmddhhmmss, noe som betyr at litt eller ombestilling og formatfjerning resulterer i et tall som kan sorteres.
Tusen takk til de andre løsningene, denne listen pakkenavn i installasjonsrekkefølgen som kan brukes i et bygget operativsystem for kopiering.
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}"
Kommentarer
- Velkommen @ alexander-cave! Legg til noen få linjer med utdata slik at folk kan se hva slags utdata du kan forvente.
Svar
Med roterte loggfiler i apt kan du:
zcat -f /var/log/dpkg.log* | grep " install " | less
Svar
Jeg har oppnådd det på Kubuntu med følgende kommandoer:
- Liste over pakkene.
- les alle standardinndata.
- lagre hele sti (sti | opprettet dato) med formatet «% n |% y » til en variabel.
- lagre navnet på filen i en variabel
- hvis begge tidligere kommandoer ble utført vellykket, vil verdiene skrives ut på en enkelt linje.
ls /var/lib/dpkg/info/*.list |while read xfile; do wpath=$(stat -c "%n|%y" ${xfile}) && wfile=$(basename ${xfile}) && printf "${wfile}|${wpath}\n" ;done
Med vennlig hilsen,