Liste des paquets sur un système basé sur apt par date dinstallation

Comment puis-je répertorier les paquets installés par date dinstallation?

Jai besoin de faire ça sur debian / ubuntu. Les réponses pour dautres distributions seraient également bien.

Jai installé beaucoup de choses pour compiler un certain morceau de code, et je veux obtenir une liste des paquets que jai dû installer.

Commentaires

Réponse

Les distributions basées sur RPM comme Red Hat sont faciles:

rpm -qa --last 

Sur Debian et dautres distributions basées sur dpkg, votre problème spécifique est également simple:

grep install /var/log/dpkg.log 

Sauf si le fichier journal a été tourné, auquel cas vous devriez essayer:

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

En général, dpkg et apt ne semblent pas suivre la date dinstallation, en raison de labsence dun tel champ dans le dpkg-query page de manuel.

Et éventuellement les anciens fichiers /var/log/dpkg.log.* seront supprimés par rotation du journal, de sorte que ce nest pas le cas  » t garanti de vous donner lhistorique complet de votre système.

Une suggestion qui apparaît plusieurs fois (par exemple ce fil ) consiste à consulter le répertoire /var/lib/dpkg/info. Les fichiers suggèrent que vous pourriez essayer quelque chose comme:

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

Pour répondre à votre question sur les sélections, voici « un premier passage.

construire la liste des packages par dates

$ 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 

construire la liste des packages installés

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

rejoindre les 2 listes

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

Pour une raison quelconque  » s nimprime pas beaucoup de différences pour moi, il peut donc y avoir un bogue ou une hypothèse invalide sur ce que signifie --get-selections.

Vous pouvez évidemment limiter les paquets soit en en utilisant find . -mtime -<days> ou head -n <lines>, et modifiez le format de sortie à votre guise, par exemple

$ 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 

pour ne lister que les sélections qui ont été installées (modifiées?) au cours des 4 derniers jours.

Vous pourriez probablement aussi supprimer les commandes sort après avoir vérifié lordre de tri utilisé par dpkg --get-selections et faites le find commande plus efficace.

Commentaires

  • Jaime généralement apt-get plus que rpm, mais maintenant Debian obtient -1 pour ne pas avoir enregistré la date dinstallation dans la base de données. Lastuce Debian inclut tous les paquets installés, pas seulement les paquets sélectionnés , mais ‘ un bon début.
  • Pour Debian vous obtenir moins de cruft (supprime half-installed entrées) si vous faites: grep install\ /var/log/dpkg.log
  • @Mikel – Excellente réponse. Jai développé le ‘ rassembler /var/lib/dpkg/info/*.list fichier info ‘ et ajouté du code pour tout filtrer mais les  » packages de niveau supérieur  » (packages atp dont aucun autre package atp ne dépend). Ce < askubuntu.com/a/948532/723997> post répond à la question  » Comment afficher lhistorique des commandes apt-get install que jai exécutées manuellement? « .
  • Debian / Ubuntu: grep " install " /var/log/dpkg.log répertorie uniquement les lignes «install» au lieu dafficher également celles «status».
  • Si ni apt ni dpkg ninstallent / modifient le datetime, cela me semble assez inacceptable en 2019. Nous avons compté sur des fichiers journaux qui peuvent ou non être encore sur la machine? Comment est-ce le cas?

Réponse

Mikel a montré comment procéder au niveau dpkg . En particulier, /var/lib/dpkg/info/$packagename.list est créé lorsque le package est installé (et non modifié par la suite).

Si vous avez utilisé les outils APT (ce que vous avez probablement fait depuis que vous  » concernant les paquets installés automatiquement ou manuellement), il ya « un historique dans /var/log/apt/history.log. Tant quil na pas tourné, il garde une trace de toutes les installations, mises à jour et suppressions dAPT, avec une annotation pour les paquets marqués comme installés automatiquement. Cest une fonctionnalité assez récente, introduite dans APT 0.7.26, donc dans Debian est apparu dans squeeze. Dans Ubuntu, 10.04 a history.log mais lannotation automatiquement installée nest pas présente avant le 10.10.

Commentaires

  • As Mikel a fait remarquer:  » Et éventuellement les anciens fichiers /var/log/dpkg.log.* seront supprimés par rotation du journal, de sorte que ce nest pas ‘ t garantit de vous donner lhistorique complet de votre système. « . Voir ceci < askubuntu.com/a/948532/723997 > réponse pour savoir comment détecter les packages de premier niveau actuels (cest-à-dire ceux dont aucun autre package ne dépend)

Réponse

Difficile, mais fonctionne:

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 

Commentaires

  • Boo, sifflement pour analyser la sortie de ls. Voir mywiki.wooledge.org/ParsingLs pour des notes sur les raisons pour lesquelles cela est dangereux / intrinsèquement bogué – loption la plus sûre est dutiliser soit find -printf ou stat --format pour générer un flux qui peut être analysé sans ambiguïté.
  • @CharlesDuffy Joli lien, mais dans un souci de simplicité, en utilisant ls -al --time-style=long-iso devrait être utile. De plus, il est probablement inconnu que quelquun nomme un package APT avec \n\t\r\v dans son nom.

Réponse

Voici le one-liner que tout le monde veut et a besoin:

 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  

Le résultat affichera tous les packages (nouvellement) installés et mis à jour dans lordre chronologique.

Lexplication de la ligne:

  • ls -1t – obtenir tous les noms de fichiers dpkg.log* dans lordre chronologique
  • zcat -f IF le fichier est de type gzip puis décompressez-le, ELSE transmettez simplement le contenu.
  • tac – Sortie inversée de cat , ligne par ligne pour sassurer que nous obtenons le bon ordre chronologique.
  • grep – Vérifiez uniquement les installés ou upgrade packages.
  • awk -F ":a" – Séparez le champ architecture du nom du package
  • column -t – joli imprimer les colonnes séparées par des espaces

On aimerait bien sûr faire un alias pour cela, mais malheureusement ce nest pas possible car awk dépend à la fois de single et double citation. À cet égard, il est préférable de le mettre dans un script bash et où le séparateur : est mieux géré pour les autres architectures dans la colonne de champ.

Le résultat est:

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 

Inconvénient:

  • Comme indiqué ci-dessus, il ne fonctionne que sur larchitecture ARM et nécessite une légère modification pour le séparateur de champ darchitecture
  • Doit être mis dans un script pour un alias facile
  • Na pas été testé sur dautres systèmes * nix

Réponse

Le fichier /var/log/apt/history.log a un format maladroit IMHO.

Date de début: {date} {heure } Ligne de commande: {command} {options …} Install: {package (version)}, …, {package (version)}, … End-Date: {date} {time}

Jaurais préféré un enregistrement plus formaté dans un fichier journal

{date} {heure} {tab} {package} {tab} {version} {tab} {command} {options} \ n

ou du XML montrant non seulement un { package} mais toutes {dépendances}.

Telle quelle est actuellement mise en et découvrez les informations que vous recherchez, mais cela nécessite un traitement médico-légal pour extraire les détails.

Réponse

Cela fonctionne pour moi sur un Système Debian, je suppose que le format de fichier a changé depuis 2011. Ce système est assez récent, donc je ne mattendrais pas à ce que cela fonctionne sur un système plus ancien, bien que cela puisse simplement nécessiter de décompresser les journaux et dutiliser un glob pour faire référence à tous dentre eux.

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

Les deux premiers champs de chaque ligne du fichier /var/log/dpkg.log sont la date et lheure. Notez lespace de fin avec install dans la partie grep, cest parce que les mises à niveau peuvent déclencher des installations mais si jai bien compris vous vouliez savoir ce qui a été installé par les utilisateurs.

Commentaires

  • Exactement ce que je fais. Facile. Mais vous pouvez utiliser zgrep et tous vos journaux .gz seront recherchés comme zgrep ‘ install ‘ /var/log/dpkg.log *.Placez lespace avant le mot  » install  » pour éviter ces  » demi-installations embêtantes « . Jai dû utiliser cut -f1,5 pour obtenir le champ du nom du paquet. Bien sûr, les anciens journaux finissent par tourner.

Réponse

GNU / Linux Debian na pas doutils intégrés pour ce problème, mais toutes les informations sur les programmes installés dans le manière standard sont enregistrées dans des fichiers avec nom-programme. list à lemplacement / var / lib / dpkg / info / . Mais il ny a aucune information sur les programmes installés manuellement.


Une longue solution sur une seule ligne :

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 

Explication :

  1. ls -rt affiche les fichiers triés par modification de la date dans lordre inverse, ie avec les fichiers les plus récents à la fin de la liste.
  2. stat imprime le fichier « s date au format lisible par lhomme.
  3. printf affiche le nom du package et la date de sa dernière modification.
  4. Le for boucle dans son ensemble imprime les noms et dates des packages du plus ancien au plus récent.

Exemple de sortie (tronqué):

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

Le principal défaut de cette solution est quelle nest pas bien testé dans le produit ion.

Commentaires

  • Cest une belle solution qui fait le travail presque. Les seuls inconvénients de ‘ sont que (1) il ‘ est très lent et (2) cela il ne s’affiche que lorsque un package a été mis à jour pour la dernière fois , aucune des versions précédentes de ‘. Ceci, bien sûr, nest pas un problème du one-liner, mais comment dpkg ne suit pas ‘ lhistorique dans /var/lib/dpkg/info/. Cest aussi pourquoi lutilisation de /var/log/dpkg.log* peut être préférée.

Réponse

Noter cela parce que vous mentionnez que dautres réponses de distribution sont les bienvenues. rpm a un grand ensemble de balises de format de sortie, dont lune est INSTALLTIME. (En utilisant wget comme exemple)

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

Cela peut être formaté de plusieurs manières. Je lutilise de cette manière:

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

Ces deux pages contiennent une tonne dinformations intéressantes sur la résolution des problèmes de métadonnées RPM:

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

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

Le tri de ces informations vous donnerait une solution efficace à votre problème.

Réponse

Cest approximatif, mais fonctionne aussi rapidement que les autres solutions. Le format de la date est aaaammjjhhmmss, ce qui signifie quun peu ou une réorganisation et une suppression du format aboutissent à un nombre qui peut être trié.

Merci beaucoup aux autres solutions, cette liste des noms de packages dans lordre dinstallation qui pourrait être utilisé dans un système dexploitation conçu pour faire une copie.

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

Commentaires

  • Bienvenue @ alexander-cave! Veuillez ajouter quelques lignes de résultat afin que les gens puissent voir à quel type de sortie sattendre.

Réponse

Avec une rotation des fichiers journaux dans apt, vous pouvez:

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

Répondre

Je lai réalisé sur Kubuntu avec les commandes suivantes:

  1. Lister les packages.
  2. lire chaque entrée standard.
  3. stocker lintégralité chemin (chemin | date de création) au format « % n |% y  » en une variable.
  4. stocker le nom du fichier dans une variable
  5. si les deux commandes précédentes ont été exécutées avec succès, les valeurs seront imprimées sur une seule ligne.
ls /var/lib/dpkg/info/*.list |while read xfile; do wpath=$(stat -c "%n|%y" ${xfile}) && wfile=$(basename ${xfile}) && printf "${wfile}|${wpath}\n" ;done 

Meilleures salutations,

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *