Question Générer la liste des packages installés manuellement et interroger des packages individuels


Je voudrais obtenir une liste des paquets installés manuellement par apt ou aptitude et être en mesure de savoir si un foobar package a été installé manuellement ou automatiquement. Existe-t-il un moyen pratique de le faire depuis la ligne de commande?


146
2017-08-16 17:07


origine


Voir cette réponse sur unix.stackexchange.com pour une solution qui filtre les packages de stock. - Dirk Bergstrom
Duplicata possible? - askubuntu.com/questions/365 - jrg♦
duplicata possible de Est-il possible de savoir quels paquets j'ai installés et qui ne sont pas dans l'installation de vanilla? - Jorge Castro
Une très bonne solution qui exclut les packages installés par défaut: Ubuntu liste les paquets explicitement installés - pcworld
Attention aux réponses des commentaires ici. Les gens ne disent pas que plus de paquets apparaissent, mais ils oublient qu'il y a des paquets de dépendances installés à partir d'un manuel installé. - Andre Figueiredo


Réponses:


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écises que toutes les solutions proposées jusqu'à présent (6 juillet 2014) dans cette question.

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 colis tombent encore dans les mailles du filet, même si je soupçonne que sont réellement installé par l'utilisateur, soit immédiatement après l'installation via la configuration de la localisation du langage, soit par ex. via l'installateur du codec Totem. En outre, les versions de linux-header semblent également s'accumuler, même si je n'ai installé que le métapaquet 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 supprime 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, ne produisez que les lignes du fichier 1 qui ne sont pas présentes dans le fichier 2.

D'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 de paquets sont affichés comme installés manuellement même s'ils ne le sont pas.
  • En utilisant apt-mark showauto au lieu de /var/log/installer/initial-status.gz. apt-mark Par exemple, n'inclut pas le paquet xserver-xorg, alors que l'autre fichier le fait.

J'ai utilisé plusieurs autres publications de StackExchange comme références, mais rien ne fonctionnait aussi bien que la solution ci-dessus:

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

EDIT: Que faire si vous avez mis à niveau depuis une version précédente:

Si vous avez mis à niveau Ubuntu d'une version à l'autre, vous devrez probablement ajuster ce processus. Dans ce cas, je vérifierais le fichier 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 fait le fichier initial_status.gz (j'ai coché).


165
2017-07-06 15:01



Cela n'a pas fonctionné pour moi parce que /var/log/installer/initial-status.gz est manquant. Aussi je veux savoir si cela dépend de la notation des apts de manual ou pas? - Anwar
Hélas, il n'y a pas de manifeste pour les versions de serveur. - Antti Haapala
J'ai couru le showmanual commande (ci-dessous). Et utilise comm comparer les deux listes (triées). le showmanual résultat m'a donné 1,840 plus forfaits uniques de apt-mark showmanual pas montré par cette méthode. NO paquets étaient uniques à la sortie de cette comm-commander. Je pense qu'il est plus intéressant d'enregistrer cela pour mon PC, 894 les packages sont listés dans les deux résultats. Je ne sais pas pourquoi il y a une telle divergence. Certains paquets (nombreux?) Semblent être spécifiques à la version. D'autres comme XOrg, les composants GTK et lib* les choses pourraient être des mises à jour. En tous cas Cette réponse est un très bon début. - will
Je viens de comparer vos solutions avec apt-mark showmanual. Il est intéressant de voir combien de différences sont visibles. votre liste contient 238 paquets alors que showmanual renvoie 1717 paquets. Des 2179 paquets installés, il n'y en a que 223 dans les deux listes, 15 sont uniquement dans les vôtres (exemples: nodejs, lightdm) et 223 sont uniquement dans showmanual (exemples: xserver-xorg, ubuntu-desktop). On a l'impression que votre liste est plus utile, mais sans savoir d'où viennent ces différences, ce n'est pas facile à décider ... (mais je suis tout à fait sûr d'avoir installé nginx et lightdm manuellement ...) le même ;)] - Daniel Alder


Dans les nouvelles versions du paquet apt, il y a aussi la commande apt-mark

apt-mark showmanual

54
2018-05-17 16:21



Exactement la réponse que je cherchais. - Wolfer
Cela montre bien plus de paquets que je l'ai installé manuellement. - Umang
@Umang Vous avez raison. Je dirais que ce n'était pas comme ça quand j'ai écrit cette réponse. Il n'y a aucune raison pour que mon système prenne en compte linux-image-3.11.0-*-generic etc comme manuel - Daniel Alder
@Umang peut-être que cela vous aidera askubuntu.com/questions/432743/…, mais la réponse n'est pas acceptée. Le fait est que de nombreux paquets d'une nouvelle installation sont déjà marqués comme manuel. Mais il y a encore des choses étranges. Pour rester avec mon exemple: linux-image-3.13.0-24-genericest manuel mais le courant linux-image-3.13.0-27-generic est automatique Il semble qu'une mise à niveau d'un package de référencement (dans ce cas, linux-image-generic, qui a changé les dépendances), la marque manuelle est automatiquement définie - Daniel Alder
@DanielAlder Certains paquets d'une nouvelle installation doivent être marqués comme manuels. Si aucun paquet marqué comme manuel, l'ensemble du système pourrait être supprimé avec apt-get autoremove. Ce n'est certainement pas ce que vous voulez. - Anton K


apt-mark showauto | grep -iE '^foobar$' va sortir "foobar" si le paquet a été installé automatiquement, rien d’autre.

aptitude search '!~M ~i' listera les paquets qui n'ont pas été installés automatiquement. Dommage que aptitude ne fasse pas partie de l’installation par défaut sur Ubuntu Desktop à partir de 10.10.


19
2017-08-16 17:32



aptitude search montre TOUS les paquets, pas seulement ceux qui sont installés manuellement (je suppose que c'est ce que l'OP voulait) - Oli♦
@Oli: examine les schémas de recherche d'aptitude; Le modèle que j'utilise doit faire exactement ce que veut l'OP. - Li Lo
je couru il. Il montre tout un paquet de paquets qui ne sont pas installés. - Oli♦
Ma faute. Corrigée. Je vous remercie. - Li Lo
Quelque chose ne va pas avec ça, j'utilise aptitude search '!~M ~i' et il répertorie 1043 paquets. Il n’ya aucun moyen d’installer ces nombreux paquets manuellement. - ThatGraemeGuy


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 bien pour clarifier exactement ce que j'ai installé à la main. Mettre 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 se déclenche aptitude ou pas. Il ne semble pas capter les installations de l'application de bureau Ubuntu Software.


11
2018-02-04 18:48





Le script suivant imprimera tous les packages qui ne sont pas définis sur l'installation automatique et 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 manière dont apt-mark imprime les paquets installés automatiquement.


8
2017-08-16 19:42



Bravo à vous, monsieur. Cela fonctionne réellement, contrairement à la réponse acceptée. - Irfy
montrer juste un couple de paquet pour moi --- manque certainement beaucoup d'entre eux. - Rmano
Même chose ici, manquant définitivement les paquets installés manuellement, juste après les avoir installés. - David Ljung Madison
En utilisant sys.exit(1) sans pour autant import sys peut entraîner une erreur dans les nouvelles versions de python. Non plus import sys Ou utiliser exit(1). - Videonauth


Comme plusieurs personnes l’ont dit, le showmanual d’apt-mark semble un peu bogué (et je l’ai signalé bug 727799). Quand je l'utilise, il signale en fait beaucoup de choses qui ne sont même pas consignées dans / var / lib / apt / extended_states (où cela est censé être stocké) et apt-get ne consigne pas les éléments installés dans / var / lib / apt / extended_states (juste dans / var / lib / dpkg / status). Le script python de txwikinger ci-dessus s'inspire 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 articles qui ne semble pas être exacte non plus.


5
2017-10-26 23:28



En utilisant sys.exit(1) sans pour autant import sys peut entraîner une erreur dans les nouvelles versions de python. Non plus import sys Ou utiliser exit(1). - Videonauth


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

apt list [option]

Les options possibles pour cela sont:

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

--manual-installed pour lister les paquets qui étaient explicitement installé par une commande, soit directement, soit en tant que dépendances.

Alternativement, vous pourriez 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, et pour obtenir des informations supplémentaires sur ces derniers, telles que la version et l'architecture prises en charge (x86, x86_64, amd64, tous, etc.)


4
2018-02-07 14:01





Comme l'a dit Li Lo, apt-mark showauto devrait vous donner une grosse liste de choses installées automatiquement.

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

Remarque: Ceci est plus une illustration de la façon dont vous regardez cool en écrasant des commandes de bash massives à 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 la lisibilité. Qu'est-ce que cela fait?

  • Nous commençons par interroger dpkg pour obtenir la liste des packages installés.
  • Nous filtrons 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 sortons parce que nous le pouvons.

1
2017-08-16 17:41



Je doute que ce soit exact, puisque dpkg affiche souvent des paquets qui ne sont pas installés - txwikinger
Je sais ce que tu veux dire mais mon bash-fu n'est pas assez fort. Je sais que vous pouvez afficher le statut de dpkg-query, le graver et ensuite supprimer le statut. Je vais essayer. - Oli♦
comm -3 <(dpkg -l | grep '^ii' | cut -d \ -f 3|sort) <(apt-mark showauto|sort) est correctement mieux;) - LassePoulsen


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

Remarque: comme prévu, de meilleures réponses sont susceptibles de fonctionner si des modifications de placement de fichiers sont apparues. Je garde le mien au cas où les informations sur l'emplacement du fichier seraient utiles.


1
2017-08-16 17:44



Non, j'ai jeté un coup d'œil sur ce fichier pour constater que liferea était marqué comme étant auto-installé. J'ai fait un apt-get install liferea et il n'a pas installé, mais j'ai eu une sortie qui était quelque chose à l'effet de "marqué comme installé manuellement". Maintenant, liferea est encore dans le fichier, sauf que la ligne suivante a un 0 au lieu d'un 1. En outre, vous devriez changer votre modèle regex à " foobar$" au lieu de juste foobar. - Umang
C'est vrai. Ma faute, dans mon système il n'y a pas de ligne avec 0, mais cela devrait être rare. Je mets à jour la réponse au cas où. - Javier Rivera


Après avoir beaucoup googlé, j'ai réussi à assembler ce script. Ça marche 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

1
2018-05-31 20:28



Vous pourriez utiliser sort -u au lieu de sort | unique. Comme apt-markn’affiche pas l’architecture, vous devez la supprimer de la sortie de dpkg avant les opérations de dpkg-query -W -f='${Package}\n'). De plus, dpkg peut lister certains paquets qui ne sont pas installés actuellement. Comme pour "desc", vous pouvez utiliser `dpkg-query -W -f = '# $ {binary: Summary} \ n' $ pack, ce qui est plus rapide. - jarno
Oh, apt-markpeut afficher l'architecture pour certains paquets, mais pas pour autant dpkg -l. - jarno
apt-cache search est lent. Obtenir une liste des dates installées à l'avance en utilisant quelque chose comme help.ubuntu.com/community/ListInstalledPackagesByDate pourrait être plus efficace - opticyclic


Je voudrais donner une solution graphique.

enter image description here

  1. Ouvrir Synaptic Package Manager

  2. Aller à 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 foobar package a été installé manuellement ou automatiquement.

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


0
2018-05-28 15:39