Hvordan kan jeg liste installerede pakker efter installationsdato?
Jeg skal gøre dette på debian / ubuntu. Svar på andre distributioner ville også være rart.
Jeg installerede en masse ting til at kompilere et bestemt stykke kode, og jeg vil gerne have en liste over de pakker, som jeg var nødt til at installere.
Kommentarer
- Se også Sådan får du historien om apt-get installation .
- Jeg googlede efter ” apt udgivelsesdato ” uden held, måske vil denne kommentar hjælpe fremtidige googlere.
- Lignende spørgsmål på askubuntu.com ” Sådan vises alle installerede pakker ” .
Svar
RPM-baserede distributioner som Red Hat er lette:
rpm -qa --last
På Debian og andre dpkg-baserede distributioner er dit specifikke problem også let:
grep install /var/log/dpkg.log
Medmindre logfilen er roteret, skal du i så fald prøve:
grep install /var/log/dpkg.log /var/log/dpkg.log.1
Generelt synes dpkg
og apt
ikke at spore installationsdatoen, idet der mangler noget sådant felt i dpkg-query
man-side.
Og til sidst vil gamle /var/log/dpkg.log.*
filer blive slettet ved logrotation, så den måde ikke er ” garanterer ikke at give dig hele systemets historie.
Et forslag, der vises et par gange (f.eks denne tråd ) er at se på /var/lib/dpkg/info
-mappen. Filerne der antyder, at du måske prøver noget i retning af:
ls -t /var/lib/dpkg/info/*.list | sed -e "s/\.list$//" | head -n 50
For at besvare dit spørgsmål om valg, her “er det første pass.
build-liste over pakker efter 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
build-liste over installerede pakker
$ dpkg --get-selections | sed -ne "/\tinstall$/{s/[[:space:]].*//;p}" | \ sort > ~/dpkglist.selections
Deltag i de 2 lister
$ join -1 1 -2 1 -t $"\t" ~/dpkglist.selections ~/dpkglist.dates \ > ~/dpkglist.selectiondates
Af en eller anden grund er det ” s udskriver ikke meget forskelle for mig, så der kan være en fejl eller en ugyldig antagelse om, hvad --get-selections
betyder.
Du kan selvfølgelig begrænse pakkerne enten ved at ved hjælp af find . -mtime -<days>
eller head -n <lines>
, og skift outputformatet, som 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 kun at liste over de valg, der var installeret (ændret?) i de sidste 4 dage.
Du kunne sandsynligvis også fjerne kommandoerne sort
efter verificering af sorteringsrækkefølgen brugt af dpkg --get-selections
og lav find
kommando mere effektiv.
Kommentarer
- Jeg kan normalt lide
apt-get
mere endrpm
, men nu får debian -1 for ikke at gemme installationsdatoen i databasen. Debian-tricket inkluderer alle de installerede pakker, ikke kun de valgte pakker, men det ‘ er en god start. - For Debian få mindre cruft (fjerner
half-installed
poster) hvis du gør:grep install\ /var/log/dpkg.log
- @Mikel – Fantastisk svar. Jeg udvidede til ‘ saml /var/lib/dpkg/info/*.list filinfo ‘ og tilføjede kode for at filtrere alle ud men ” pakker på øverste niveau ” (atp-pakker, som ingen andre atp-pakker er afhængige af). Det < askubuntu.com/a/948532/723997> indlæg besvarer spørgsmålet ” Hvordan kan jeg se historikken om apt-get installationskommandoer, som jeg manuelt har udført? “.
- Debian / Ubuntu:
grep " install " /var/log/dpkg.log
viser kun “installation” -linjerne i stedet for at vise “status” også. - Hvis hverken apt eller dpkg gemmer installation / ændret datatid, virker det ret uacceptabelt for mig i 2019. Vi er afhængige af at gribe logfiler, som måske eller ikke stadig er på maskinen? Hvordan er dette tilfældet?
Svar
Mikel har vist, hvordan man gør dette på dpkg-niveau . Især oprettes /var/lib/dpkg/info/$packagename.list
, når pakken er installeret (og ikke ændres bagefter).
Hvis du brugte APT-værktøjerne (hvilket du formodentlig gjorde siden du “) er bekymret over automatisk mod manuelt installerede pakker), er der “en historie i /var/log/apt/history.log
. Så længe den ikke har roteret væk, holder den styr på alle APT-installationer, opgraderinger og fjernelser med en kommentar til pakker markeret som automatisk installeret. Dette er en ret ny funktion, der blev introduceret i APT 0.7.26, så i Debian dukkede op. I Ubuntu, 10.04 har history.log
, men den automatisk installerede kommentar er først til 10.10.
Kommentarer
- Som Mikel påpegede: ” Og til sidst gamle /var/log/dpkg.log.* filer slettes ved logrotation, så den måde er ikke ‘ t garanterer at give dig hele historikken for dit system. “. Se dette < askubuntu.com/a/948532/723997 > svar for, hvordan man finder de nuværende topniveaupakker (hvilket betyder dem, som ingen anden pakke afhænger af)
Svar
Groft, 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, hvæs til analyse af output fra
ls
. Se mywiki.wooledge.org/ParsingLs for noter om, hvorfor dette er farligt / iboende buggy – den sikrere mulighed er at bruge entenfind -printf
ellerstat --format
for at generere en stream, der entydigt kan parses. - @CharlesDuffy Dejligt link, men med det formål at gøre det enkelt ved hjælp af
ls -al --time-style=long-iso
skal være nyttigt. Derudover er det sandsynligvis uhørt, at nogen vil navngive en APT-pakke med\n\t\r\v
i navnet.
Svar
Her er one-liner alle ønsker og har brug for:
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 (nyligt) installerede og opgraderede pakker i kronologisk rækkefølge.
Linjeforklaringen:
-
ls -1t
– hent alledpkg.log*
filnavne i kronologisk rækkefølge -
zcat -f
– HVIS filen er af gzip type, skal du derefter dekomprimere den, ELSE videregiver bare indholdet. -
tac
– Omvendt output fra kat , linje for linje for at sikre, at vi får den korrekte kronologiske rækkefølge. -
grep
– Kontroller kun for installeret eller opgradere pakker. -
awk -F ":a"
– Adskil feltet arkitektur fra pakkens navn -
column -t
– smukt udskriv kolonnerne adskilt af mellemrum
Man vil selvfølgelig gerne lave et alias for dette, men det er desværre ikke muligt som awk afhænger af både single og dobbelt citater. I den henseende placeres dette bedst i et bash-script, og hvor :
separatoren håndteres bedre for andre arkitekturer i feltkolonnen.
Outputtet 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 kun på ARM-arkitektur og har brug for en lille ændring af arkitekturfeltadskilleren
- Skal sættes i et script til let alias
- Er ikke blevet testet på tværs af andre * nix-systemer
Svar
Filen /var/log/apt/history.log
har et akavet format IMHO.
Startdato: {date} {time } Kommandolinje: {kommando} {valgmuligheder …} Installer: {pakke (version)}, …, {pakke (version)}, … Slutdato: {dato} {tid}
Jeg ville have foretrukket en mere logfil-formateret post
{date} {time} {tab} {package} {tab} {version} {tab} {command} {options} \ n
eller noget XML, der ikke kun viser en { pakke} men alle {afhængigheder}.
Som aktuelt implementeret, c en opdage de oplysninger, du søger, men det kræver en del retsmedicinsk behandling for at udtrække detaljerne.
Svar
Dette fungerer for mig på en Debian-system, jeg gætter på, at filformatet har ændret sig siden 2011. Dette system er ret nyt, så jeg ville ikke forvente, at dette fungerer på et ældre system, selvom det måske bare kræver, at logfilerne udpakkes og en glob bruges til at henvise til alle af dem.
grep "install " /var/log/dpkg.log.1 | sort | cut -f1,2,4 -d" "
De to første felter i hver linje i filen /var/log/dpkg.log
er datoen og klokkeslættet. Bemærk efterpladsen med installation i grep-delen, dette skyldes, at opgraderinger kan udløse installationer, men hvis jeg forstod rigtigt, ville du vide, hvad der blev installeret af brugerne.
Kommentarer
- Præcis hvad jeg laver. Let. Men du kan bruge zgrep, og dine alle .gz-logfiler søges som zgrep ‘ install ‘ /var/log/dpkg.log *.Placer mellemrummet foran ordet ” installer ” for at forhindre de irriterende ” halvinstallationer “. Jeg var nødt til at bruge cut -f1,5 for at få feltet med pakkenavn. Naturligvis roterer de gamle logfiler til sidst ud.
Svar
GNU / Linux Debian har ingen indbyggede værktøjer til dette problem, men al information om programmer installeret i standard måde gemmes i filer med programnavn. liste på placeringen / var / lib / dpkg / info / . Men der er ingen oplysninger om manuelt installerede 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
output filer sorteret efter datoændring i omvendt rækkefølge ie med de nyeste filer i slutningen af listen. -
stat
udskriver filen “s dato i menneskelig læsbar form. -
printf
viser pakkens navn og datoen for den sidste ændring. -
for
loop som helhed udskriver pakkenavne og datoer fra ældste til nyeste.
Eksempel på output (trunkeret):
......................................... 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
Hovedfejlen ved denne løsning er, at den ikke er godt testet i produkt ion.
Kommentarer
- Dette er en smuk løsning, der gør jobbet næsten færdig. Det ‘ er kun ulemper, er at (1) det ‘ er meget langsomt og (2) at det kun viser, når en pakke blev sidst opdateret , ikke nogen af den ‘ s tidligere versioner. Dette er naturligvis ikke et problem med one-liner, men hvordan dpkg ikke ‘ ikke holder styr på historien i
/var/lib/dpkg/info/
. Det er også derfor, at brug af/var/log/dpkg.log*
måske foretrækkes.
Svar
Bemærk dette, fordi du nævner, at andre distributionssvar er velkomne. rpm har et stort sæt tags til outputformat, hvoraf den ene er INSTALLTIME. (Brug wget
som et eksempel)
rpm -qi wget --qf "%{NAME},%{INSTALLTIME}\n" | tail -n 1 wget,1454014156
Dette kan formateres på få måder. Jeg bruger det på denne måde:
rpm -qi wget --qf "%{NAME},%{INSTALLTIME:date}\n" | tail -n 1 wget,Thu 28 Jan 2016 03:49:16 PM EST
Disse to sider har masser af god information om løsning af problemer med RPM-metadata:
http://www.rpm.org/max-rpm/s1-rpm-query-parts.html
http://www.rpm.org/max-rpm/s1-rpm-query-handy-queries.html
Sortering af disse oplysninger vil give dig en fungerende løsning til dit problem.
Svar
Det er groft, men fungerer lige så hurtigt som andre løsninger. Datoformat er yyyymmddhhmmss, hvilket betyder, at en bit eller ombestilling og formatfjerning resulterer i et nummer, der kan sorteres.
Mange tak til de andre løsninger, denne liste pakkenavne i den rækkefølge af installation, der kunne bruges i et bygget operativsystem til kopi.
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! Tilføj venligst et par linjer med output , så folk kan se, hvilken type output de kan forvente.
Svar
Med roterede logfiler i apt kan du:
zcat -f /var/log/dpkg.log* | grep " install " | less
Svar
Jeg har opnået det på Kubuntu med følgende kommandoer:
- Liste over pakkerne.
- læs hver standardindgang.
- gem den fulde sti (sti | oprettet dato) med formatet “% n |% y ” til en variabel.
- gemme navnet på filen i en variabel
- hvis begge tidligere kommandoer blev udført med succes, vil værdier blive udskrevet i 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 venlig hilsen