Liste opp pakker på et apt-basert system etter installasjonsdato

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

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 enn rpm, 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 enten find -printf eller stat --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å alle dpkg.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 :

  1. ls -rt utdata filer sortert etter datoendring i omvendt rekkefølge ie med de nyeste filene på slutten av listen.
  2. stat skriver ut filen «s dato i menneskelig lesbar form.
  3. printf viser pakkenavnet og datoen for siste endring.
  4. 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:

  1. Liste over pakkene.
  2. les alle standardinndata.
  3. lagre hele sti (sti | opprettet dato) med formatet «% n |% y » til en variabel.
  4. lagre navnet på filen i en variabel
  5. 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,

Legg igjen en kommentar

Din e-postadresse vil ikke bli publisert. Obligatoriske felt er merket med *