web-dev-qa-db-fra.com

Liste des paquets explicitement installés

En gentoo il y a le fichier /var/lib/portage/world qui contient des packages que j'ai explicitement installés. Par explicite, je veux dire, les packages que j'ai choisis, n'incluant rien d'installé par défaut ou retiré par les dépendances.

Y a-t-il un fichier similaire ou une commande pour trouver ces informations à Ubuntu?

53
phunehehe

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 le casser en trois parties:

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

Comment obtenir une liste de packages non installés comme des dépendances?

La commande suivante semble fonctionner sur mon système:

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

Des approches similaires peuvent être trouvées dans les liens que Gilles a affiché comme un commentaire à la question. Certaines sources affirment que cela ne fonctionnera que si vous utilisiez des aptitudes pour installer les packages; Cependant, je n'utilise presque jamais d'aptitude pour installer des packages et constaté que cela a toujours fonctionné. Les --disable-columns empêche les aptitudes des lignes de rembourrage des noms de paquets avec des blancs qui entraveraient la comparaison ci-dessous. Les | sort -u Trie le fichier et supprime les doublons. Cela rend la dernière étape beaucoup plus facile.

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

Remarque: Cette section commence par un "mauvais chemin" que je pense est illustratif. Le deuxième morceau de code est celui qui fonctionne.

Ceci est un peu plus délicat. J'ai initialement pensé qu'une bonne approximation serait tous les packages qui sont des dépendances des méta-packages Ubuntu-Minimal, Ubuntu-Standard, Ubuntu-Desktop et les différents packages liés au noyau Linux. Quelques résultats sur Google Recherches semblaient utiliser cette approche. Pour obtenir une liste de ces dépendances, j'ai d'abord essayé ce qui suit (qui n'a pas fonctionné):

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

Cela semble laisser des paquets que je sais devait être par défaut. Je crois toujours que cette méthode devrait fonctionner si l'on construit la bonne liste de métapackages.

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/relases/precise/ubuntu-12.04.3-desktop-amd64.Manifest

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

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

Vous devriez être capable de trouver le fichier ".manifest" qui correspond à la version et à l'architecture que vous utilisez. Extraire juste les noms de paquets que 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 être sûr qu'il a été correctement trié pour faciliter la prochaine étape. J'ai ensuite mis la sortie en defaultinstalled.txt.

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

C'est la partie la plus facile car la plupart des systèmes de type UNIX ont de nombreux outils pour le faire. L'outil comm est l'un des nombreux moyens de le faire:

comm -23 currentlyinstalled.txt defaultinstalled.txt

Cela devrait imprimer la liste des lignes propres au premier fichier. Ainsi, il devrait imprimer une liste des packages installés non dans l'installation par défaut.

46
Steven D

Vous pouvez utiliser l'une de ces deux doublures. Tous deux donnent exactement la même sortie 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 publié cette réponse ici .

en 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)

en 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 forfaits tombent toujours à travers les fissures, bien que je soupçonne ces sont En fait installé par l'utilisateur, juste après l'installation via la configuration de localisation de la langue ou par E. à travers le programme d'installation du codec Totem. En outre, les versions de l'en-tête Linux semblent également accumuler, même si je n'ai installé que la métapackage 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. Obtenez la liste des packages installés manuellement. Pour aptitude, le supplément sed élimine les espaces restants à la fin de la ligne.
  2. Obtenez la liste des packages installés juste après une nouvelle installation.
  3. Comparez les fichiers, seule la sortie des lignes dans le fichier 1 qui ne sont pas présentes dans le fichier 2.

Autres possibilités ne fonctionnent pas aussi bien:

  • En utilisant le ubuntu-14.04-desktop-AMD64.manifest Fichier ( ICI pour Ubuntu 14.04) au lieu de /var/log/installer/initial-status.gz. Plus d'emballages sont indiqués manuellement, même s'ils ne le sont pas.
  • À l'aide de apt-mark showauto à la place de /var/log/installer/initial-status.gz. apt-mark Par exemple, n'inclut pas le package XServer-Xorg, tandis que l'autre fichier le fait.

Les deux répertorient plus de packages que la solution ci-dessus.

24
jmiserez

Selon man apt-mark:

apt-mark showauto
apt-mark showmanual
9
mmaruska

Voici quelques échantillons 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

Quant à votre question, filtrez le matériel avec Grep (cat /var/log/apt/history.log | grep Commandline).

Notez que ces fichiers sont tournés, vérifiez donc les autres afin de 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é à la fois aptitude et synaptique (versions .7 et .6. respectivement), et ils sont tous deux en train de se loger leurs activités sur ce fichier journal. Le revers avec eux est qu'ils n'ont pas la ligne commençant par Commandline, donc le truc grep Trick ne fonctionnera pas avec eux.
8
tshepang

Je suis tombé sur ce bel oneiliner 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) \
  )`

Ces paquets Filtres OneLiner installés par système à l'aide de journaux de /var/log/installer/initial-status.gz

Je posterai le lien vers le fil d'origine lorsque je l'ai trouvé, car cet Onliner n'est pas à moi et que je ne peux pas sembler souvenir d'où je l'ai vu.

7
Archit

Vous voudriez avoir un coup d'œil à cet article .

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

Il a été écrit pour (k) ubuntu . Mais devrait fonctionner pour Ubuntu aswell.

3
Stefan

Vous trouverez ci-dessous un ajout à Steven D .

La ligne suivante semble tronquer des 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

2
Wes Turner

Vérifier /var/log/apt/term.log

1
Joril

Vous pouvez également regarder 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.

1
Laurent Lyaudet

Gros remerciements et félicitations à ceux qui ont créé ce gemme d'un script !!!
[.____] Je voulais ajouter mes 2 ¢ et je suis tombé sur la date d'installation que je déduit à partir de $ info.
[.____], je n'ai pas maîtrisé les détails pourquoi $ info fichiers sont mis à jour ou non et quand, mais cela fonctionne dans la pratique.
[.____] Mon script répertorie les dernières mises à jour des packages non de dépendance ajoutés après l'installation.
[.____] lui donner un chèque périodique, je voyais ce que j'aurais connecté manuellement sans une seule manquue.
[.____] c'est-à-dire que des lots de paquets installés pour la même raison. Malheureusement, les mises à jour cassent cet ordre.
[.____] Après une mise à niveau du système, j'ai eu une liste de mes paquets ajoutés que la mise à niveau n'a pas été mise à jour, suivie de celles qu'elle a fait.
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
0
Papou