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
- Voir aussi Comment obtenir lhistorique dapt-get install .
- Je cherchais » apt release date » sans chance, peut-être que ce commentaire aidera les futurs googleurs.
- Question similaire à askubuntu.com » Comment répertorier tous les packages installés » .
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 querpm
, 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 soitfind -printf
oustat --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 fichiersdpkg.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 :
-
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. -
stat
imprime le fichier « s date au format lisible par lhomme. -
printf
affiche le nom du package et la date de sa dernière modification. - 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:
- Lister les packages.
- lire chaque entrée standard.
- stocker lintégralité chemin (chemin | date de création) au format « % n |% y » en une variable.
- stocker le nom du fichier dans une variable
- 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,