Cum pot lista pachetele instalate după data instalării?
Trebuie să fac asta pe debian / ubuntu. Răspunsurile pentru alte distribuții ar fi de asemenea frumoase.
Am instalat multe lucruri pentru a compila o anumită bucată de cod și vreau să obțin o listă a pachetelor pe care a trebuit să le instalez. >
Comentarii
- Consultați și Cum se obține istoricul apt-get install .
- Mă căutam după ” data de lansare apt ” fără noroc, poate că acest comentariu va ajuta viitorii googeri.
- Întrebare similară la askubuntu.com ” Cum se listează toate pachetele instalate ” .
Răspuns
Distribuțiile bazate pe RPM precum Red Hat sunt ușoare:
rpm -qa --last
Pe Debian și alte distribuții bazate pe dpkg, și problema dvs. specifică este ușoară:
grep install /var/log/dpkg.log
Cu excepția cazului în care fișierul jurnal a fost rotit, caz în care ar trebui să încercați:
grep install /var/log/dpkg.log /var/log/dpkg.log.1
În general, dpkg
și apt
nu par să urmărească data instalării, trecând prin lipsa oricărui astfel de câmp din dpkg-query
pagina manuală.
Și în cele din urmă fișierele /var/log/dpkg.log.*
vechi vor fi șterse prin rotația jurnalului, astfel încât nu este așa ” Garantat că vă va oferi întregul istoric al sistemului dvs.
O sugestie care apare de câteva ori (de ex acest fir ) este să vă uitați la directorul /var/lib/dpkg/info
. Fișierele de acolo vă sugerează că ați putea încerca ceva de genul:
ls -t /var/lib/dpkg/info/*.list | sed -e "s/\.list$//" | head -n 50
Pentru a răspunde la întrebarea dvs. despre selecții, aici este prima trecere.
creați lista pachetelor după date
$ 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ți lista pachetelor instalate
$ dpkg --get-selections | sed -ne "/\tinstall$/{s/[[:space:]].*//;p}" | \ sort > ~/dpkglist.selections
alăturați-vă celor 2 liste
$ join -1 1 -2 1 -t $"\t" ~/dpkglist.selections ~/dpkglist.dates \ > ~/dpkglist.selectiondates
Din anumite motive este ” Nu tipăresc foarte multe diferențe pentru mine, deci ar putea exista o eroare sau o presupunere nevalidă despre ceea ce înseamnă --get-selections
.
Evident, puteți limita pachetele fie prin folosind find . -mtime -<days>
sau head -n <lines>
și modificați formatul de ieșire după cum doriți, de ex.
$ 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
pentru a afișa doar selecțiile care au fost instalate (modificate?) în ultimele 4 zile.
Probabil ați putea elimina și comenzile sort
după verificarea ordinii de sortare folosite de dpkg --get-selections
și efectuați find
comanda este mai eficientă.
Comentarii
- De obicei, îmi place
apt-get
mai mult decâtrpm
, dar acum debian obține -1 pentru că nu a salvat data instalării în baza de date. Trucul debian include toate pachetele instalate, nu doar pachetele selectate , ci este ‘ un bun început. - Pentru Debian obțineți mai puțin cruft (elimină intrările
half-installed
) dacă faceți:grep install\ /var/log/dpkg.log
- @Mikel – Răspuns excelent. Am extins la ‘ collect /var/lib/dpkg/info/*.list informații despre fișier ‘ și am adăugat cod pentru a filtra toate dar ” pachetele de nivel superior ” (pachete ATP de care nu depind alte pachete ATP). Acel < askubuntu.com/a/948532/723997> post răspunde la întrebarea ” Cum pot vizualiza istoricul comenzilor apt-get install pe care le-am executat manual? „.
- Debian / Ubuntu:
grep " install " /var/log/dpkg.log
listează numai liniile „instalare”, mai degrabă decât afișarea celor „de stare”. - Dacă nici apt, nici dpkg store nu au instalat / modificat datetime, mi se pare destul de inacceptabil în 2019. Ne bazăm pe fișierele jurnal grepping care pot fi sau nu încă pe mașină? Cum este cazul?
Răspuns
Mikel a arătat cum se face acest lucru la nivelul dpkg . În special, /var/lib/dpkg/info/$packagename.list
este creat atunci când pachetul este instalat (și nu este modificat ulterior).
Dacă ați folosit instrumentele APT (ceea ce probabil ați făcut de când ați făcut acest lucru) sunteți îngrijorat de pachetele instalate automat și manual), există „un istoric în /var/log/apt/history.log
. Atâta timp cât nu s-a rotit, ține evidența tuturor instalațiilor, actualizărilor și eliminărilor APT, cu o adnotare pentru pachetele marcate ca instalate automat. Aceasta este o caracteristică destul de recentă, introdusă în APT 0.7.26, deci în Debian a apărut în stoarcere. În Ubuntu, 10.04 are history.log
dar adnotarea instalată automat nu este prezentă până la 10.10.
Comentarii
- Ca Mikel a subliniat: ” Și în cele din urmă fișierele vechi /var/log/dpkg.log.* vor fi șterse prin rotația jurnalului, astfel încât acest mod nu este ‘ nu este garantat să vă ofere întregul istoric al sistemului dvs. „. Vedeți acest < askubuntu.com/a/948532/723997 > răspuns pentru cum să detectați pachetele actuale de nivel superior (adică cele de care nu depinde niciun alt pachet)
Răspuns
Rough, dar funcționează:
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
Comentarii
- Boo, șuierător pentru analiza rezultatelor din
ls
. Consultați mywiki.wooledge.org/ParsingLs pentru note despre motivul în care acest lucru este periculos / în mod inerent buggy – opțiunea mai sigură este să utilizați fiefind -printf
saustat --format
pentru a genera un flux care poate fi analizat fără echivoc. - @CharlesDuffy Nice link, dar în scopul simplității, folosind
ls -al --time-style=long-iso
ar trebui să vă fie de ajutor. În plus, este probabil nemaiauzit că cineva ar numi un pachet APT cu\n\t\r\v
în numele său.
Răspuns
Iată un singur liner pe care toată lumea îl dorește și îl are nevoie:
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
Rezultatul va afișa toate pachetele (recent) instalate și actualizate în ordine cronologică.
Explicația liniei:
-
ls -1t
– obțineți toatedpkg.log*
numele fișierelor în ordine cronologică -
zcat -f
– IF fișierul este de tip gzip apoi decomprimați-l, ELSE trebuie doar să transmiteți conținutul. -
tac
– Reverse output of cat , rând cu rând, pentru a ne asigura că obținem ordinea cronologică corectă. -
grep
– Verificați numai dacă există instalat sau upgrade pachete. -
awk -F ":a"
– Separați câmpul arhitectură de numele pachetului -
column -t
– imprimați destul de bine coloanele separate de spațiu
S-ar dori, desigur, să creați un alias pentru acest lucru, dar, din păcate, nu este posibil ca awk depinde atât de single, cât și de ghilimele duble. În această privință, acest lucru este cel mai bine pus într-un script bash și unde separatorul :
este tratat mai bine pentru alte arhitecturi din coloana câmpului.
Rezultatul este:
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
Dezavantaj:
- Așa cum se arată mai sus, funcționează doar pe arhitectura ARM și necesită o ușoară modificare pentru separatorul de câmp de arhitectură
- Trebuie introdus în un script pentru alias ușor
- Nu a fost testat pe alte sisteme * nix
Răspuns
Fișierul /var/log/apt/history.log
are un format IMHO incomod.
Data de începere: {data} {ora } Linie de comandă: {comandă} {opțiuni …} Instalare: {pachet (versiune)}, …, {pachet (versiune)}, … Data de încheiere: {dată} {oră}
Aș fi preferat o înregistrare formatată mai mult cu fișier jurnal
{date} {time} {tab} {package} {tab} {version} {tab} {command} {options} \ n
sau unele XML care arată nu numai un { pachet}, dar orice {dependențe}.
După cum este implementat în prezent, c o descoperiți informațiile pe care le căutați, dar necesită o procesare criminalistică pentru a extrage detaliile.
Răspuns
Acest lucru funcționează pentru mine pe un Sistem Debian, presupun că formatul de fișier s-a schimbat din 2011. Acest sistem este destul de proaspăt, așa că nu m-aș aștepta ca acest lucru să funcționeze pe un sistem mai vechi, deși ar putea fi necesară dezarhivarea jurnalelor și utilizarea unui glob pentru a se dintre ele.
grep "install " /var/log/dpkg.log.1 | sort | cut -f1,2,4 -d" "
Primele două câmpuri din fiecare linie a fișierului /var/log/dpkg.log
sunt data și ora. Rețineți spațiul final cu instalare în partea grep, acest lucru se datorează faptului că actualizările pot declanșa instalări, dar dacă am înțeles corect ați dori să știți ce a fost instalat de utilizatori.
Comentarii
- Exact ceea ce fac. Uşor. Dar puteți utiliza zgrep și toate jurnalele dvs. .gz vor fi căutate ca zgrep ‘ install ‘ /var/log/dpkg.log *.Plasați spațiul înaintea cuvântului ” instalați ” pentru a preveni acele ” jumătăți de instalare plictisitoare „. A trebuit să folosesc cut -f1,5 pentru a obține câmpul cu numele pachetului. Bineînțeles că în cele din urmă vechile jurnale se rotesc.
Răspuns
GNU / Linux Debian nu are instrumente încorporate pentru această problemă, dar toate informațiile despre programele instalate în mod standard sunt salvate în fișiere cu program-name. list în locația / var / lib / dpkg / info / . Dar nu există informații despre programele instalate manual acolo.
O soluție lungă cu o singură linie :
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ție :
-
ls -rt
scoate fișiere sortate după modificarea datei în ordine inversă, ie cu cele mai noi fișiere la sfârșitul listei. -
stat
tipărește fișierele data în formă lizibilă de om. -
printf
afișează numele pachetului și data ultimei modificări a acestuia. -
for
bucla ca întreg imprimă numele pachetelor și datează de la cele mai vechi la cele mai noi.
Exemplu de ieșire (trunchiat):
......................................... 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
Principalul defect al acestei soluții. este că nu este bine testat în produs ion.
Comentarii
- Aceasta este o soluție frumoasă care face ca treaba să fie aproape terminată. Este ‘ doar dezavantajele, este că (1) este ‘ foarte lent și (2) că se afișează numai când un pachet a fost actualizat ultima dată , nu unul dintre versiunile anterioare ‘. Aceasta, desigur, nu este o problemă a liniei unice, dar modul în care dpkg nu ‘ ține evidența istoriei în
/var/lib/dpkg/info/
. De aceea, poate fi preferată utilizarea/var/log/dpkg.log*
.
Răspuns
Observând acest lucru pentru că menționați că alte răspunsuri la distribuție sunt binevenite. rpm are un set mare de etichete de format de ieșire, dintre care una este INSTALLTIME. (Folosind wget
ca exemplu)
rpm -qi wget --qf "%{NAME},%{INSTALLTIME}\n" | tail -n 1 wget,1454014156
Acest lucru poate fi formatat în câteva moduri. Îl folosesc în acest fel:
rpm -qi wget --qf "%{NAME},%{INSTALLTIME:date}\n" | tail -n 1 wget,Thu 28 Jan 2016 03:49:16 PM EST
Aceste două pagini au o mulțime de informații excelente despre rezolvarea problemelor de metadate RPM:
http://www.rpm.org/max-rpm/s1-rpm-query-parts.html
http://www.rpm.org/max-rpm/s1-rpm-query-handy-queries.html
Sortarea acestor informații vă va oferi o soluție de lucru pentru problema dvs.
Răspuns
Este dur, dar funcționează la fel de repede ca alte soluții. Formatul datei este aaaaaaaaaaaaaaa, ceea ce înseamnă că un mic sau reordonarea și eliminarea formatului rezultă într-un număr care poate fi sortat.
Mulțumită celorlalte soluții, această listă nume de pachete în ordinea instalării care ar putea fi utilizate în un sistem de operare creat pentru a face copierea.
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}"
Comentarii
- Bun venit @ alexander-cave! Vă rugăm să adăugați câteva linii de ieșire , astfel încât oamenii să poată vedea la ce tip de ieșire să se aștepte.
Răspuns
Cu fișierele jurnal rotite în apt puteți:
zcat -f /var/log/dpkg.log* | grep " install " | less
Răspunde
Am realizat-o pe Kubuntu cu următoarele comenzi:
- Enumerați pachetele.
- citiți fiecare intrare standard.
- stocați întregul cale (cale | data creată) cu formatul „% n |% y ” într-o variabilă.
- stocați numele fișierului într-o variabilă
- dacă ambele comenzi anterioare au fost executate cu succes, valorile vor fi tipărite într-o singură linie.
ls /var/lib/dpkg/info/*.list |while read xfile; do wpath=$(stat -c "%n|%y" ${xfile}) && wfile=$(basename ${xfile}) && printf "${wfile}|${wpath}\n" ;done
Salutări,