Enumerați pachetele pe un sistem bazat pe apt după data instalării

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

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ât rpm, 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 fie find -printf sau stat --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 toate dpkg.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 :

  1. ls -rt scoate fișiere sortate după modificarea datei în ordine inversă, ie cu cele mai noi fișiere la sfârșitul listei.
  2. stat tipărește fișierele data în formă lizibilă de om.
  3. printf afișează numele pachetului și data ultimei modificări a acestuia.
  4. 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:

  1. Enumerați pachetele.
  2. citiți fiecare intrare standard.
  3. stocați întregul cale (cale | data creată) cu formatul „% n |% y ” într-o variabilă.
  4. stocați numele fișierului într-o variabilă
  5. 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,

Lasă un răspuns

Adresa ta de email nu va fi publicată. Câmpurile obligatorii sunt marcate cu *