Liste les paquets explicitement installés

53

Dans Gentoo, le fichier /var/lib/portage/worldcontient des packages que j’ai explicitement installés. Par explicite, je veux dire, les paquets que je choisis, n'incluant rien installé par défaut ou tiré par les dépendances.

Existe-t-il un fichier similaire ou une commande permettant de trouver cette information dans Ubuntu?

phunehehe
la source

Réponses:

46

Juste le code

aptitude search '~i !~M' -F '%p' --disable-columns | sort -u > currentlyinstalled.txt
wget -qO - http://mirror.pnl.gov/releases/precise/ubuntu-12.04.3-desktop-amd64.manifest \
  | cut -f1 | sort -u > defaultinstalled.txt
comm -23 currentlyinstalled.txt defaultinstalled.txt

Explication

Une façon de penser à ce problème est de la diviser en trois parties:

  • Comment obtenir une liste de paquets non installés en tant que dépendances?
  • Comment obtenir une liste des packages installés par défaut?
  • Comment puis-je obtenir la différence entre ces deux listes?

Comment obtenir une liste de paquets non installés en tant que dépendances?

La commande suivante semble fonctionner sur mon système:

$ aptitude search '~i !~M' -F '%p' --disable-columns | sort -u > currentlyinstalled.txt

Des liens similaires peuvent être trouvés dans les liens que Gilles a postés en tant que commentaire à la question. Certaines sources affirment que cela ne fonctionnera que si vous avez utilisé aptitude pour installer les paquets. Cependant, je n’utilise presque jamais aptitude pour installer des paquets et j’ai trouvé que cela fonctionnait toujours. Les --disable-columnsempêche l' aptitude des lignes de rembourrage noms de paquets avec des blancs qui entraveraient la comparaison ci - dessous. Le | sort -utrie le fichier et supprime les doublons. Cela rend l'étape finale beaucoup plus facile.

Comment obtenir une liste des packages installés par défaut?

Remarque: cette section commence par un «mauvais chemin» qui, à mon avis, est illustratif. Le deuxième morceau de code est celui qui fonctionne.

C'est un peu plus compliqué. Au départ, je pensais qu'une bonne approximation serait l'ensemble des paquets qui sont des dépendances des méta-paquets ubuntu-minimal, ubuntu-standard, ubuntu-desktop et des divers paquets liés au noyau Linux. Quelques résultats sur les recherches Google semblent utiliser cette approche. Pour obtenir une liste de ces dépendances, j'ai d'abord essayé ce qui suit (ce qui n'a pas fonctionné):

$ apt-cache depends ubuntu-desktop ubuntu-minimal ubuntu-standard linux-* | awk '/Depends:/ {print $2}' | sort -u

Cela semble laisser de côté certains paquets qui, je le sais, ont dû arriver par défaut. Je crois toujours que cette méthode devrait fonctionner si on construit la bonne liste de méta-paquets.

Cependant, il semble que les miroirs Ubuntu contiennent un fichier "manifeste" contenant tous les packages de l'installation par défaut. Le manifeste pour Ubuntu 12.04.3 est ici:

http://mirror.pnl.gov/releases/precise/ubuntu-12.04.3-desktop-amd64.manifest

Si vous recherchez dans cette page (ou dans la page d’un miroir plus proche de vous):

http://mirror.pnl.gov/releases/precise/

Vous devriez pouvoir trouver le fichier ".manifest" correspondant à la version et à l'architecture que vous utilisez. Pour extraire uniquement les noms de paquets, j'ai fait ceci:

wget -qO - http://mirror.pnl.gov/releases/precise/ubuntu-12.04.3-desktop-amd64.manifest | cut -f1 | sort -u > defaultinstalled.txt

La liste était probablement déjà triée et unique, mais je voulais m'assurer qu'elle était correctement triée pour faciliter la prochaine étape. Je mets ensuite la sortie en defaultinstalled.txt.

Comment puis-je obtenir la différence entre ces deux listes?

C’est la partie la plus facile car la plupart des systèmes de type Unix disposent de nombreux outils pour le faire. L’ commoutil est l’une des façons de procéder:

comm -23 currentlyinstalled.txt defaultinstalled.txt

Cela devrait imprimer la liste des lignes qui sont uniques au premier fichier. Ainsi, il devrait imprimer une liste des paquets installés ne figurant pas dans l'installation par défaut.

Steven D
la source
Qu'est-ce que votre premier pipeline ne aptitude search '~i!~M' -F %pfait pas?
éphémère
@ ephemient: Probablement rien. Je ne connais pas grand-chose d'aptitude et utilise donc des outils que je connais bien plutôt que de fouiller dans le fichier homme d'un programme que je n'utilise jamais.
Steven D
1
Vous avez en quelque sorte détruit mon espoir, je pensais qu'il existait un moyen simple et standard :(
phunehehe
3
Cela fonctionne presque, mais toujours pas correct. Il existe plusieurs packages et bibliothèques que je n'ai certainement pas installés manuellement et qui figurent dans la liste résultante. J'ai utilisé http://releases.ubuntu.com/releases/trusty/ubuntu-14.04-desktop-amd64.manifestle supplément | sed "s/ *$//"mais toujours pas de dés.
Jmiserez
1
La première étape qui obtient une liste de paquets non installés en tant que dépendances peut être remplacée par apt-mark showmanual | sort -u, comme indiqué dans d'autres réponses. Plus simple, et ne repose pas sur aptitudece qui n’est pas installé par défaut.
skagedal
24

Vous pouvez utiliser l'une ou l'autre de ces deux lignes. Les deux donnent exactement le même résultat sur ma machine et sont plus précis que toutes les solutions proposées jusqu'à présent (juillet 2014) dans cette question. Ils sont une combinaison des deux réponses (1) et (2) . Notez que j'ai initialement posté cette réponse ici .

Utilisant apt-mark:

comm -23 <(apt-mark showmanual | sort -u) <(gzip -dc /var/log/installer/initial-status.gz | sed -n 's/^Package: //p' | sort -u)

Utilisant aptitude:

comm -23 <(aptitude search '~i !~M' -F '%p' | sed "s/ *$//" | sort -u) <(gzip -dc /var/log/installer/initial-status.gz | sed -n 's/^Package: //p' | sort -u)

Très peu de paquets restent encore entre les mailles du filet, bien que je soupçonne que ceux - ci sont réellement installés par l'utilisateur, soit juste après l'installation via la configuration de la localisation de la langue ou, par exemple, via l'installateur de codecs Totem. De plus, les versions de linux-header semblent également s'accumuler, même si je n'ai installé que le méta-paquet non spécifique à la version. Exemples:

libreoffice-help-en-gb
openoffice.org-hyphenation
gstreamer0.10-fluendo-mp3
linux-headers-3.13.0-29    

Comment ça marche

  1. Obtenir la liste des packages installés manuellement. Pour aptitude, les sedbandes supplémentaires éliminent les espaces blancs restants à la fin de la ligne.
  2. Obtenez la liste des paquets installés juste après une nouvelle installation.
  3. Comparez les fichiers, affichez uniquement les lignes du fichier 1 qui ne sont pas présentes dans le fichier 2.

Les autres possibilités ne fonctionnent pas aussi bien:

  • Utiliser le ubuntu-14.04-desktop-amd64.manifestfichier ( ici pour Ubuntu 14.04) au lieu de /var/log/installer/initial-status.gz. Plus de paquets sont montrés comme installés manuellement même s'ils ne le sont pas.
  • Utiliser apt-mark showautoau lieu de /var/log/installer/initial-status.gz. apt-markpar exemple, n'inclut pas le paquet xserver-xorg, contrairement à l'autre fichier.

Les deux listes plus de paquets que la solution ci-dessus.

jmiserez
la source
Si vous avez mis à niveau votre système depuis votre installation initiale (ce qui est le cas pour la plupart des gens, je pense), il est préférable d'utiliser le fichier manifeste de votre version actuelle d'Ubuntu.
Diego V
Si vous avez mis à niveau, je pense que vous devrez utiliser les deux fichiers, pas seulement le fichier manifeste. Vous pouvez facilement le faire en ajoutant simplement une autre comparaison. Le fichier manifeste ne contient malheureusement pas tout ce que contient le fichier initial_status.gz (j'ai vérifié).
jmiserez
Je suis impressionné! J'ai trouvé une pièce manquante cependant. Qu'en est-il des packages initialement installés, puis explicitement supprimés manuellement , mais ultérieurement réinstallés explicitement manuellement ? J'ai trouvé cela dans un système de travail.
n611x007
1
J'ai posé une question unix.SE/225330: Répertorie explicitement les packages (apt) supprimés pour traiter la majeure partie du travail.
n611x007
1
C'est mieux que la solution acceptée, car l' URL mirror.pnl.gov/releases/Precise/… dans la solution acceptée est maintenant un 404.
télécharger Mun
9

Selon man apt-mark:

apt-mark showauto
apt-mark showmanual
mmaruska
la source
2
showmanualmontre des choses comme xserver-xorg-video-vesa, je jure que je n’ai pas installé manuellement.
Phunehehe
probablement installé automatiquement par votre distribution lors de la première installation.
Matt
8

Voici un exemple de sortie de cat /var/log/apt/history.log:

Start-Date: 2011-01-22  00:43:38
Commandline: apt-get --target-release experimental install libdbus-1-dev
Upgrade: libdbus-1-3:i386 (1.4.0-1, 1.4.1-1), libdbus-1-dev:i386 (1.4.0-1, 1.4.1-1)
End-Date: 2011-01-22  00:43:48

Start-Date: 2011-01-23  01:16:13
Commandline: apt-get --auto-remove purge webcheck
Purge: python-utidylib:i386 (0.2-6), python-beautifulsoup:i386 (3.1.0.1-2), libtidy-0.99-0:i386 (20091223cvs-1), webcheck:i386 (1.10.3)
End-Date: 2011-01-23  01:16:31

En ce qui concerne votre question, filtrez le contenu avec grep ( cat /var/log/apt/history.log | grep Commandline).

Notez que ces fichiers sont soumis à une rotation, alors recherchez-en d'autres pour ne rien manquer:

$ ls /var/log/apt/history.log*
-rw-r--r-- 1 root root 69120 2011-01-23 18:58 /var/log/apt/history.log
-rw-r--r-- 1 root root 19594 2011-01-01 02:48 /var/log/apt/history.log.1.gz

NOTE :

  • J'ai vérifié aptitude et synaptic (versions 0.70 et 0.6.3 respectivement) et tous les deux enregistrent leurs activités dans ce fichier journal. Le seul inconvénient avec eux est qu’ils n’ont pas la ligne commençant par celle-ci Commandline, l’ grepastuce ne marche donc pas avec eux.
Tshepang
la source
2
Solution intéressante. Vous aurez besoin d'ajuster un peu la commande grep pour obtenir juste une liste de paquetages et pour tenir compte des paquetages installés par aptitudeet d'autres gestionnaires de paquetages. Si vos journaux ont tourné, alors vous n'avez pas de chance.
Steven D
@steven Mis à jour. Mon grep-fu est d'un novice, alors je laisserai cela au lecteur. De plus, je ne sais pas si la chose tourne. Je n'ai qu'à archiver moi-même.
Tshepang
Leur rotation dépendra de votre configuration logrotate et de la durée de vie de votre système. Je ne suis pas sûr des valeurs par défaut d'Ubuntu, car cela fait longtemps que je ne les ai pas modifiées.
Steven D
7

Je suis tombé sur cette belle oneliner pendant que je cherchais cette requête

La doublure est

comm -13 \
  <(gzip -dc /var/log/installer/initial-status.gz | sed -n 's/^Package: //p' | sort) \
  <(comm -23 \
    <(dpkg-query -W -f='${Package}\n' | sed 1d | sort) \
    <(apt-mark showauto | sort) \
  )`

Ce filtre filtre les paquets installés par le système en utilisant les journaux de /var/log/installer/initial-status.gz

Je posterai le lien vers le fil d’origine lorsque je l’aurai trouvé, car cet élément n’est pas le mien et j’ai l’impression de ne pas me rappeler où je l’ai vu.

Architecte
la source
3

Vous voudriez jeter un oeil à cet article .

À la fin de l'article, vous trouverez un script python qui devrait faire ce que vous voulez.

C'était écrit pour (k) ubuntu . mais devrait aussi fonctionner pour Ubuntu .

Stefan
la source
3
le lien ne semble plus fonctionner.
Rog
2
Les liens brisés comme ceux-ci expliquent pourquoi il est important d’inclure les informations pertinentes dans votre réponse.
whitehat101
2

Ci - dessous un ajout à la réponse de Steven D' .

La ligne suivante semble tronquer les noms de package à 32 caractères:

aptitude search '~i !~M' | cut -d" " -f4 | sort -u > currentlyinstalled.txt

Cela semble fonctionner:

aptitude search '~i !~M' -F "%p" > sort -u > currentlyinstalled.txt

voir cette réponse

Wes Turner
la source
1

Check-out /var/log/apt/term.log

Joril
la source
2
c'est une façon assez pénible de faire les choses, et il n'y a pas de distinction entre les paquets que j'installe moi-même et ceux qui sont entraînés par des dépendances
phunehehe
Je suis d'accord, mais je ne savais pas
qu'apt était capable de
1

Vous pouvez également consulter le fichier /var/lib/apt/extended_states.

cat /var/lib/apt/extended_states | grep -B2 'Auto-Installed: 0'

Ceci est utile si vous voulez savoir ce qui a été installé sur une ancienne partition.

Laurent Lyaudet
la source
0

Un grand merci et félicitations à ceux qui ont créé ce joyau de script !!!
Je voulais ajouter 2 ¢ et j'ai ajouté la date d'installation déduite de $ info.
Je ne maîtrisais pas les détails de la mise à jour ou non des fichiers $ info et quand, mais cela fonctionne dans la pratique.
Mon script répertorie les dernières mises à jour des packages non dépendants ajoutés après l'installation.
En lui donnant un contrôle périodique, je voyais ce que j'aurais enregistré manuellement sans un oubli.
C’est-à-dire des lots de paquets installés pour la même raison. Malheureusement, les mises à jour rompent cet ordre.
Après une mise à niveau du système, j'ai eu une liste de mes packages ajoutés que la mise à jour n'a pas mis à jour, suivis de ceux qu'elle a faits.
Soigné! Prendre plaisir.

info='/var/lib/dpkg/info/'

comm -13 > /tmp/packages \
  <(gzip -dc /var/log/installer/initial-status.gz | sed -n 's/^Package: //p' | sort) \
  <(comm -23 \
    <(dpkg-query -W -f='${Package}\n' | sed 1d | sort) \
    <(apt-mark showauto | sort) \
  )

while read n; do
  echo $(ls -ltr --time-style=long-iso $info$n.* $info$n:i386.* $info$n:amd64.* 2>/dev/null \
    | tail -n 1 | perl -pe 's/.*([0-9]{4}?-.*:[0-9]{2}?).*/\1/') $n
done < /tmp/packages | sort
Papou
la source