Auflisten von Paketen auf einem apt-basierten System nach Installationsdatum

Wie kann ich installierte Pakete nach Installationsdatum auflisten?

Ich muss dies auf debian / ubuntu tun. Antworten für andere Distributionen wären auch nett.

Ich habe viele Dinge installiert, um einen bestimmten Code zu kompilieren, und ich möchte eine Liste der Pakete erhalten, die ich installieren musste. P. >

Kommentare

Antwort

RPM-basierte Distributionen wie Red Hat sind einfach:

rpm -qa --last 

Bei Debian- und anderen dpkg-basierten Distributionen ist Ihr spezifisches Problem ebenfalls einfach:

grep install /var/log/dpkg.log 

Sofern die Protokolldatei nicht gedreht wurde, sollten Sie Folgendes versuchen:

grep install /var/log/dpkg.log /var/log/dpkg.log.1 

Im Allgemeinen scheinen dpkg und apt das Installationsdatum nicht zu verfolgen, da kein solches Feld im Feld vorhanden ist dpkg-query Manpage.

Und schließlich werden alte /var/log/dpkg.log.* -Dateien durch Protokollrotation gelöscht, so dass dies nicht der Fall ist. “ Es wird garantiert, dass Sie den gesamten Verlauf Ihres Systems erhalten.

Ein Vorschlag, der einige Male vorkommt (z Dieser Thread ) soll das Verzeichnis /var/lib/dpkg/info anzeigen. Die dortigen Dateien schlagen vor, dass Sie Folgendes versuchen könnten:

ls -t /var/lib/dpkg/info/*.list | sed -e "s/\.list$//" | head -n 50 

Um Ihre Frage zur Auswahl zu beantworten, klicken Sie hier auf einen ersten Durchgang.

Liste der Pakete nach Datum erstellen

$ 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 

Liste der installierten Pakete erstellen

$ dpkg --get-selections | sed -ne "/\tinstall$/{s/[[:space:]].*//;p}" | \ sort > ~/dpkglist.selections 

den 2 Listen beitreten

$ join -1 1 -2 1 -t $"\t" ~/dpkglist.selections ~/dpkglist.dates \ > ~/dpkglist.selectiondates 

Aus irgendeinem Grund “ Wenn ich nicht sehr viele Unterschiede drucke, liegt möglicherweise ein Fehler oder eine ungültige Annahme darüber vor, was --get-selections bedeutet.

Sie können die Pakete natürlich entweder durch einschränken Verwenden Sie find . -mtime -<days> oder head -n <lines> und ändern Sie das Ausgabeformat nach Ihren Wünschen, z. B.

$ 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 

, um nur die Auswahlen aufzulisten, die in den letzten 4 Tagen installiert (geändert?) wurden.

Sie können wahrscheinlich auch die Befehle sort entfernen Nachdem Sie die von dpkg --get-selections verwendete Sortierreihenfolge überprüft und die find Befehl effizienter.

Kommentare

  • Normalerweise mag ich apt-get mehr als rpm, aber jetzt erhält debian -1, weil das Installationsdatum nicht in der Datenbank gespeichert wurde. Der Debian-Trick umfasst alle installierten Pakete, nicht nur die ausgewählten Pakete, sondern ‚ ist ein guter Anfang.
  • Für Debian you Erhalten Sie weniger Cruft (entfernt half-installed -Einträge), wenn Sie Folgendes tun: grep install\ /var/log/dpkg.log
  • @Mikel – Großartige Antwort. Ich habe die Datei ‚ /var/lib/dpkg/info/*.list file info ‚ erweitert und Code hinzugefügt, um alle herauszufiltern aber die “ Top-Level-Pakete “ (atp-Pakete, von denen keine anderen atp-Pakete abhängen). Das < askubuntu.com/a/948532/723997> post beantwortet die Frage “ Wie kann ich den Verlauf von apt-get-Installationsbefehlen anzeigen, die ich manuell ausgeführt habe? „.
  • Debian / Ubuntu: grep " install " /var/log/dpkg.log listet nur die „Install“ -Zeilen auf, anstatt auch die „Status“ -Zeilen anzuzeigen.
  • Wenn weder apt noch dpkg store datetime installiert / geändert haben, erscheint mir das 2019 ziemlich inakzeptabel. Wir verlassen uns auf Grepping-Protokolldateien, die sich möglicherweise noch auf dem Computer befinden oder nicht? Wie ist das der Fall?

Antwort

Mikel hat gezeigt, wie das auf dpkg-Ebene geht . Insbesondere wird /var/lib/dpkg/info/$packagename.list erstellt, wenn das Paket installiert (und anschließend nicht geändert) wird.

Wenn Sie die APT-Tools verwendet haben (was Sie vermutlich seit Ihrer Einführung getan haben) In Bezug auf automatisch oder manuell installierte Pakete gibt es einen Verlauf in /var/log/apt/history.log. Solange es nicht weggedreht wurde, verfolgt es alle APT-Installationen, -Upgrades und -Entfernungen mit einer Anmerkung für Pakete, die als automatisch installiert markiert sind. Dies ist eine relativ neue Funktion, die in APT 0.7.26 eingeführt wurde, also in Debian erschien in Squeeze. In Ubuntu, 10.04 hat history.log, aber die automatisch installierte Anmerkung ist erst am 10.10.

Kommentare

  • As Mikel wies darauf hin: “ Und schließlich werden alte /var/log/dpkg.log.*-Dateien durch Protokollrotation gelöscht, so dass dies nicht ‚ Es wird nicht garantiert, dass Sie den gesamten Verlauf Ihres Systems erhalten. „. Siehe dies < askubuntu.com/a/948532/723997 > Antwort, wie die aktuellen Pakete der obersten Ebene erkannt werden (dh diejenigen, von denen kein anderes Paket abhängt)

Antwort

Rau, funktioniert aber:

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 

Kommentare

  • Boo, zischen Sie, um die Ausgabe von zu analysieren ls. Unter mywiki.wooledge.org/ParsingLs finden Sie Hinweise, warum dies gefährlich / von Natur aus fehlerhaft ist. Die sicherere Option ist die Verwendung von oder stat --format, um einen Stream zu generieren, der eindeutig analysiert werden kann.
  • @CharlesDuffy Netter Link, aber der Einfachheit halber mit ls -al --time-style=long-iso sollte hilfreich sein. Darüber hinaus ist es wahrscheinlich unerhört, dass jemand ein APT-Paket mit \n\t\r\v im Namen benennt.

Antwort

Hier ist der Einzeiler, den jeder will und braucht:

 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  

Das Ergebnis zeigt alle (neu) installierten und aktualisierten Pakete in chronologischer Reihenfolge.

Die Zeilenerklärung:

  • ls -1t – Alle dpkg.log* Dateinamen in chronologischer Reihenfolge abrufen
  • zcat -f WENN die Datei vom Typ gzip ist, dekomprimieren Sie sie, ELSE geben Sie einfach den Inhalt weiter.
  • tac – Ausgabe von cat umkehren Zeile für Zeile, um sicherzustellen, dass wir die richtige chronologische Reihenfolge erhalten.
  • grep – Nur nach installiert oder Upgrade -Pakete.
  • awk -F ":a" – Trennen Sie das Feld Architektur vom Paketnamen
  • column -t – drucke die durch Leerzeichen getrennten Spalten hübsch aus

Man möchte natürlich einen Alias dafür erstellen, aber leider ist dies nicht möglich awk hängt sowohl von single als auch von ab Anführungszeichen. In dieser Hinsicht wird dies am besten in ein Bash-Skript eingefügt, in dem das Trennzeichen : für andere Architekturen in der Feldspalte besser behandelt wird.

Die Ausgabe lautet:

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 

Nachteil:

  • Wie oben gezeigt, funktioniert es nur in der ARM-Architektur und muss geringfügig geändert werden, damit das Architekturfeldtrennzeichen
  • eingefügt werden kann Ein Skript für einfachen Alias
  • Wurde nicht auf anderen * nix-Systemen getestet.

Antwort

Die Datei /var/log/apt/history.log hat meiner Meinung nach ein umständliches Format.

Startdatum: {Datum} {Uhrzeit } Befehlszeile: {Befehl} {Optionen …} Installation: {Paket (Version)}, …, {Paket (Version)}, … Enddatum: {Datum} {Zeit}

Ich hätte einen Datensatz mit mehr Protokolldateien bevorzugt.

{Datum} {Uhrzeit} {tab} {package} {tab} {version} {tab} {command} {options} \ n

oder ein XML, das nicht nur ein { Paket}, aber alle {Abhängigkeiten}.

Wie derzeit implementiert, c und entdecken Sie die Informationen, die Sie suchen, aber es erfordert eine forensische Verarbeitung, um die Details zu extrahieren.

Antwort

Dies funktioniert bei mir auf a Debian-System, ich vermute, das Dateiformat hat sich seit 2011 geändert. Dieses System ist ziemlich frisch, daher würde ich nicht erwarten, dass dies auf einem älteren System funktioniert, obwohl dies möglicherweise nur das Entpacken der Protokolle und die Verwendung eines Globs erfordert, um auf alle zu verweisen

grep "install " /var/log/dpkg.log.1 | sort | cut -f1,2,4 -d" " 

Die ersten beiden Felder in jeder Zeile der Datei /var/log/dpkg.log sind Datum und Uhrzeit. Beachten Sie den nachgestellten Speicherplatz mit der Installation im grep-Teil. Dies liegt daran, dass Upgrades Installationen auslösen können. Wenn ich das richtig verstanden habe, wollten Sie wissen, was von den Benutzern installiert wurde.

Kommentare

  • Genau das, was ich tue. Einfach. Sie können jedoch zgrep verwenden und alle Ihre .gz-Protokolle werden wie zgrep durchsucht. ‚ install ‚ /var/log/dpkg.log *.Platzieren Sie das Leerzeichen vor dem Wort “ install „, um diese lästigen “ Halbinstallationen zu vermeiden „. Ich musste cut -f1,5 verwenden, um das Paketnamenfeld zu erhalten. Natürlich werden die alten Protokolle irgendwann ausgeblendet.

Antwort

GNU / Linux Debian verfügt über keine integrierten Tools Für dieses Problem werden jedoch alle Informationen zu Programmen, die auf die Standardmethode installiert sind, in Dateien mit dem Programmnamen gespeichert. Liste am Speicherort / var / lib / dpkg / info / . Es gibt dort jedoch keine Informationen zu manuell installierten Programmen.


Eine lange einzeilige Lösung :

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 

Erläuterung :

  1. ls -rt gibt Dateien sortiert nach aus Datumsänderung in umgekehrter Reihenfolge, dh mit den neuesten Dateien am Ende der Liste.
  2. stat druckt die Datei „s Datum in lesbarer Form.
  3. printf zeigt den Paketnamen und das Datum seiner letzten Änderung an.
  4. Die -Schleife als Ganzes druckt Paketnamen und datiert vom ältesten zum neuesten.

Ausgabebeispiel (abgeschnitten):

......................................... 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 

Der Hauptfehler dieser Lösung ist, dass dies nicht der Fall ist im Produkt gut getestet

Kommentare

  • Dies ist eine schöne Lösung, mit der die Arbeit fast erledigt ist. ‚ hat nur die Nachteile, dass (1) es ‚ sehr langsam ist und (2) dass es nur zeigt, wann Ein Paket wurde zuletzt aktualisiert , keines der vorherigen Versionen von ‚. Dies ist natürlich kein Problem des Einzeilers, aber wie dpkg ‚ den Verlauf in /var/lib/dpkg/info/ nicht verfolgt. Aus diesem Grund kann auch die Verwendung von /var/log/dpkg.log* bevorzugt werden.

Antwort

Beachten Sie dies, weil Sie erwähnen, dass andere Verteilungsantworten willkommen sind. rpm verfügt über eine große Anzahl von Ausgabeformat-Tags, von denen eines INSTALLTIME ist. (Am Beispiel von wget)

rpm -qi wget --qf "%{NAME},%{INSTALLTIME}\n" | tail -n 1 wget,1454014156 

Dies kann auf verschiedene Arten formatiert werden. Ich benutze es folgendermaßen:

rpm -qi wget --qf "%{NAME},%{INSTALLTIME:date}\n" | tail -n 1 wget,Thu 28 Jan 2016 03:49:16 PM EST 

Diese beiden Seiten enthalten eine Menge großartiger Informationen zum Lösen von RPM-Metadatenproblemen:

http://www.rpm.org/max-rpm/s1-rpm-query-parts.html

http://www.rpm.org/max-rpm/s1-rpm-query-handy-queries.html

Wenn Sie diese Informationen sortieren, erhalten Sie eine funktionierende Lösung für Ihr Problem.

Antwort

Es ist rau, funktioniert aber genauso schnell wie andere Lösungen. Das Datumsformat ist yyyymmddhhmmss, was bedeutet, dass ein Bit oder eine Neuordnung und Formatentfernung zu einer Zahl führt, die sortiert werden kann.

Vielen Dank an die anderen Lösungen, diese Paketnamen in der Reihenfolge der Installation, in der sie verwendet werden könnten Ein Betriebssystem zum Erstellen von Kopien.

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}" 

Kommentare

  • Willkommen bei Alexander-Cave! Bitte fügen Sie ein paar Zeilen Ausgabe hinzu, damit die Benutzer sehen können, welche Art von Ausgabe zu erwarten ist.

Antwort

Mit gedrehten Protokolldateien in apt können Sie:

zcat -f /var/log/dpkg.log* | grep " install " | less 

Antwort

Ich habe es auf Kubuntu mit den folgenden Befehlen erreicht:

  1. Listen Sie die Pakete auf.
  2. Lesen Sie jede Standardeingabe.
  3. Speichern Sie die vollständigen Pfad (Pfad | Erstellungsdatum) mit dem Format „% n |% y “ in eine Variable.
  4. Speichern Sie den Namen der Datei in einer Variablen.
  5. Wenn beide vorherigen Befehle erfolgreich ausgeführt wurden, werden die Werte in einer einzigen Zeile gedruckt.
ls /var/lib/dpkg/info/*.list |while read xfile; do wpath=$(stat -c "%n|%y" ${xfile}) && wfile=$(basename ${xfile}) && printf "${wfile}|${wpath}\n" ;done 

Mit freundlichen Grüßen,

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.