web-dev-qa-db-fra.com

Génération d'une liste de packages installés manuellement et interrogation de packages individuels

J'aimerais obtenir une liste des packages installés manuellement par apt ou aptitude et pouvoir savoir si un package foobar a été installé manuellement ou automatiquement. Existe-t-il un moyen intéressant de le faire depuis la ligne de commande?

176
Umang

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 (6 juillet 2014) dans cette question.

Utilisation de apt-mark:

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

Utilisation de 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 tombent 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 dans la configuration de la localisation de la langue, par exemple. via l'installateur de codecs Totem. En outre, 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, la variable sed supprime les espaces 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:

  • Utilisation du fichier ubuntu-14.04-desktop-AMD64.manifest ( here 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 showauto au lieu de /var/log/installer/initial-status.gz. apt-mark par exemple n'inclut pas le paquet xserver-xorg, contrairement à l'autre fichier.

J'ai utilisé divers autres postes StackExchange comme référence, mais aucun ne fonctionne aussi bien que la solution ci-dessus:

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

EDIT: que faire si vous avez mis à jour une version précédente:

Si vous avez mis à jour Ubuntu d’une version à l’autre, vous devrez probablement ajuster ce processus. Dans ce cas, je vérifierais le fichier de manifeste de la nouvelle version (voir ci-dessus) en plus du fichier initial-status.gz de la version actuelle. Vous pouvez facilement le faire en ajoutant simplement une autre comparaison. Utiliser uniquement le fichier manifeste ne fonctionnera pas, car le fichier manifeste ne contient malheureusement pas tout ce que contient le fichier initial_status.gz (j'ai vérifié).

200
jmiserez

Dans les versions plus récentes du paquet apt, il y a aussi la commande apt-mark

apt-mark showmanual
64
Daniel Alder

apt-mark showauto | grep -iE '^foobar$' affichera "foobar" si le paquet a été installé automatiquement, rien sinon.

aptitude search '!~M ~i' liste les paquets qui n'ont pas été installés automatiquement. C'est dommage qu'aptitude ne fasse pas partie de l'installation par défaut sur Ubuntu Desktop à partir de 10.10.

20
Li Lo

Pour Ubuntu 16.04, consultez le fichier journal /var/log/apt/history.log.

Par exemple:

zgrep 'Commandline: apt' /var/log/apt/history.log /var/log/apt/history.log.*.gz

Ce n’est pas parfait, mais c’est assez bon pour préciser exactement ce que j’ai installé à la main. Placez un -B 1 sur le grep pour voir quand il a été installé.

Exemple de sortie

Commandline: apt install postgresql-9.5-plv8
Commandline: aptdaemon role='role-install-file' sender=':1.85'
Commandline: apt install task
Commandline: apt autoremove
Commandline: apt install atom
Commandline: apt upgrade
Commandline: apt-get install asciinema
Commandline: apt install iperf3
Commandline: apt upgrade
Commandline: apt-get install chromium-browser
Commandline: apt install joe cpanminus build-essential postgresql libdbd-pg-Perl libcrypt-openssl-bignum-Perl libcrypt-openssl-rsa-Perl libio-socket-ssl-Perl libnet-ssleay-Perl libssl-dev
Commandline: aptdaemon role='role-commit-packages' sender=':1.2314'
Commandline: apt install git
Commandline: apt install sqlite
Commandline: apt install whois
Commandline: apt install libdbd-pg-Perl
Commandline: apt install Perl-doc
Commandline: apt upgrade

Je ne sais pas si cela détecte aptitude ou non. Il ne semble pas que les installations de l'application de bureau Ubuntu Software soient récupérées.

19
s1037989

Le script suivant imprimera tous les packages qui ne sont pas définis pour l'installation automatique et qui ont donc été installés manuellement:

#!/usr/bin/python

try:
    import apt_pkg
except ImportError:
    print "Error importing apt_pkg, is python-apt installed?"
    sys.exit(1)

apt_pkg.init()
STATE_FILE = apt_pkg.config.find_dir("Dir::State") + "extended_states"
auto = set()
tagfile = apt_pkg.TagFile(open(STATE_FILE))
while tagfile.step():
    pkgname = tagfile.section.get("Package")
    autoInst = tagfile.section.get("Auto-Installed")
    if not int(autoInst):
        auto.add(pkgname)
print "\n".join(sorted(auto))

il est basé sur la façon dont apt-mark affiche les paquets installés automatiquement.

8
txwikinger

Comme plusieurs personnes l'ont commenté, apt-mark showmanual semble être un peu buggé (et je l'ai signalé comme bug 727799 ). Lorsque je l'utilise, il rapporte en fait beaucoup de choses qui ne sont même pas consignées dans/var/lib/apt/extended_states (où elles sont censées être stockées) et apt-get ne consigne pas les choses telles qu'elles sont installées dans/var/lib/apt/extended_states (uniquement dans/var/lib/dpkg/status). Le script python de txwikinger ci-dessus tire directement de/var/lib/apt/extended_states mais si vous l'utilisez aujourd'hui, la syntaxe risque de ne pas fonctionner (le mien vient de générer des erreurs avec Kubuntu 13.10). La syntaxe mise à jour est la suivante:

#!/usr/bin/python
import sys

try:
    import apt_pkg
except ImportError:
    print "Error importing apt_pkg, is python-apt installed?"
    sys.exit(1)

apt_pkg.init()
STATE_FILE = apt_pkg.config.find_dir("Dir::State") + "extended_states"
auto = set()
tagfile = apt_pkg.TagFile(open(STATE_FILE))
while tagfile.step():
    pkgname = tagfile.section.get("Package")
    autoInst = tagfile.section.get("Auto-Installed")
    if not int(autoInst):
        auto.add(pkgname)
print "\n".join(sorted(auto))

Pour moi, c'était une liste très courte de 5 éléments qui ne semble pas être exacte non plus.

5
cluelesscoder

Pour obtenir la liste de tous les packages (non installés, installés par l'utilisateur ou installés par défaut, sur tous les PPA), apt utilise la méthode suivante:

apt list [option]

Les options possibles pour cela sont:

--installed pour afficher uniquement les packages installés sur le système (sur plus de 50 000)

--manual-installed pour répertorier les packages explicitement installés par une commande, directement ou sous forme de dépendances.

Alternativement, vous pouvez faire:

apt list --manual-installed | grep -F \[installed\] pour obtenir une liste des packages résultant des commandes utilisateur et de leurs dépendances uniquement, ainsi que pour obtenir des informations supplémentaires telles que la version et l'architecture prises en charge (x86, x86_64, AMD64, tous, etc.)

5
Aalok

Je voudrais donner une solution graphique.

enter image description here

  1. Ouvrez Synaptic Package Manager

  2. Allez à Status

  3. Cliquez sur Installed (manual)

Il donnera la liste des paquets installés manuellement par apt ou aptitude.

Malheureusement, je n'ai trouvé aucune option dans Custom Filters pour savoir si un paquet foobar a été installé manuellement ou automatiquement.

Si le paquet est sous Installed mais pas sous Installed (manual), il a été installé automatiquement. Si le paquet est sous Installed (manual), il a été installé manuellement.

3
blueray

Si personne ne vous donne une bonne réponse en utilisant une commande apr-quelque chose, vous pouvez le faire à la manière . Apt-get stocke ses informations dans/var/lib/apt/extended_states. Tout fichier installé automatiquement sera ajouté à ce fichier. Si vous installez manuellement un paquet déjà dans ce fichier, le paquet restera dans ce fichier mais avec Auto-installé: 0 à la deuxième ligne. Ce n'est pas supprimé.

Remarque: Comme prévu, de meilleures réponses sont susceptibles de fonctionner si les changements d'emplacement de fichier sont apparus. Je garde le mien au cas où les informations sur l'emplacement du fichier seraient utiles.

2
Javier Rivera

Après avoir beaucoup cherché sur Google, j'ai réussi à assembler ce script. Cela fonctionne bien pour moi:

# List of all packages currently installed
current=$(dpkg -l | awk '{print $2}' | sort | uniq)

# List of all packages that were installed with the system
pre=$(gzip -dc /var/log/installer/initial-status.gz | sed -n 's/^Package: //p' | sort | uniq)

# List of packages that don't depend on any other package
manual=$(apt-mark showmanual | sort | uniq)

# (Current - Pre) ∩ (Manual)
packages=$(comm -12 <(comm -23 <(echo "$current") <(echo "$pre")) <(echo "$manual") )

for pack in $packages; do
    packname=$(echo $pack | cut -f 1 -d ":")
    desc=$(apt-cache search "^$packname$" | sed -E 's/.* - (.*)/\1/')
    date=$(date -r /var/lib/dpkg/info/$pack.list)

    echo "# $desc"
    echo "# $date"
    echo "Sudo apt-get install $pack"
    echo -e ""
done
2
dufferZafar

Comme l'a dit Li Lo, apt-mark showauto devrait vous fournir une liste complète d'éléments automatiquement installés.

Maintenant, pour montrer les choses qui sont installées manuellement, il s’avère qu’il existe un joli modificateur de recherche simple pour aptitude. Mais vous ne voulez pas faire ça. Vous voulez écrire une énorme commande bash qui fait de la science de fusée.

Remarque: Ceci est davantage une illustration de la façon dont vous allez avoir l'air cool de donner des ordres bash massifs à tous vos amis.

comm -3  <(dpkg-query --show -f '${Package} ${Status}\n' | \n
grep "install ok installed" | cut --delimiter=' ' -f 1) <(apt-mark showauto)

Je l'ai cassé sur deux lignes pour plus de lisibilité. Qu'est-ce que cela fait?

  • Premièrement, nous interrogeons dpkg pour obtenir une liste des packages installés.
  • Nous filtrons ceux pour ceux qui sont réellement installés (pas seulement la configuration résiduelle)
  • Nous coupons le statut
  • Nous comparons cette liste avec la liste automatisée de apt-mark
  • Nous basculons parce que nous pouvons.
1
Oli