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


183

Je voudrais obtenir une liste des paquets installés manuellement par aptou aptitudeet savoir si un foobarpaquet a été installé manuellement ou automatiquement. Existe-t-il un moyen intéressant de le faire depuis la ligne de commande?


Voir cette réponse sur unix.stackexchange.com pour une solution de filtrage des packages en stock.
Dirk Bergstrom le

Doublon possible? - askubuntu.com/questions/365
jrg


Vraiment une bonne solution qui exclut les paquets installés par défaut: Ubuntu liste explicitement les paquets installés
pcworld

Attention aux commentaires des réponses ici. Les gens ne disent pas que plus de paquets apparaissent, mais ils oublient qu'il existe des paquets de dépendances installés à partir d'un manuel installé.
André Figueiredo

Réponses:


206

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.

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 suppose 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 en fin de 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.

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 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é).


7
Cela n'a pas fonctionné pour moi car il /var/log/installer/initial-status.gzmanque. Aussi, je veux savoir si cela dépend de l'apts manualou non?
Anwar

1
Hélas, il n'y a pas de manifeste pour les versions de serveur.
Antti Haapala

J'ai couru la showmanualcommande (ci-dessous). Et utilisez commpour comparer les deux listes (triées). Le showmanualrésultat m'a donné 1840 paquets plus uniques de apt-mark showmanualnon représentés par cette méthode. AUCUN paquet n'était spécifique à la sortie de cette commcommande. Je pense qu'il est plus intéressant d'enregistrer que pour mon PC, 894 paquets sont listés dans Les deux résultats. Je ne sais pas pourquoi il y a une telle différence. Certains (beaucoup?) Paquets semblent être spécifiques à la version. D'autres comme XOrg, les composants GTK et d'autres lib*choses pourraient être mises à jour. Quoi qu'il en soit, cette réponse est un très bon début.
sera

Je viens de comparer vos solutions avec apt-mark showmanual. C'est intéressant de voir combien de différences sont visibles. Votre liste contient 238 paquets, tandis que showmanual en retourne 1717. Sur les 2179 paquets installés, il n'y en a que 223 dans les deux listes, 15 le sont dans la vôtre (exemples: nodejs, lightdm) et 223 dans le fichier showmanual (exemples: xserver-xorg, ubuntu-desktop). Il semble que votre liste soit plus utile, mais sans savoir d'où viennent ces différences, il n'est pas facile de décider ... (mais je suis sûr que j'ai installé manuellement nginx et lightdm ...) [désolé, je viens d'écrire le même;)]
Daniel Alder

64

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

apt-mark showmanual

35
Cela montre bien plus de paquets que ceux que j'ai installés manuellement.
Umang

1
@ 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 sur mon système de considérer linux-image-3.11.0-*-genericetc comme manuel
Daniel Alder

1
@ Umang peut-être que cela vous aidera à askubuntu.com/questions/432743/… , mais la réponse n'est pas acceptée. Le fait est que beaucoup de paquets d'une nouvelle installation sont déjà marqués comme manuels. 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-genericest automatique. Il semble qu'une mise à jour 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

5
@DanielAlder Certains paquets d'une nouvelle installation doivent être marqués comme manuels. Si aucun paquet marqué comme manuel, le système entier peut être supprimé avec apt-get autoremove. Ce n'est certainement pas ce que vous voulez.
Anton K

2
Si "installé manuellement" signifie "installé par l'utilisateur après l'installation initiale du système d'exploitation", la réponse n'est pas correcte.
Seamus

21

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. Mettez un -B 1sur 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 prend aptitudeou non. Il ne semble pas que les installations de l'application de bureau Ubuntu Software soient récupérées.


1
De toutes les réponses au fil des ans, c'est la seule qui se rapproche même dans le serveur 18.04.
Quentin Skousen le

20

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

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


aptitude searchmontre TOUS les paquets pas seulement ceux qui sont installés manuellement (je suppose que c'est ce que l'OP voulait)
Oli

1
@ Oli: examinez les modèles de recherche d'aptitude; le modèle que j'utilise devrait faire exactement ce que le PO veut.
Li Lo

Je l'ai couru . Il montre un tas de paquets qui ne sont pas installés.
Oli

7
Quelque chose ne va pas avec cela, je l'utilise aptitude search '!~M ~i'et il répertorie 1043 paquets. Il n’ya aucun moyen d’installer autant de paquets manuellement.
ThatGraemeGuy le

Cela ne fonctionne vraiment pas comme demandé, imprime aussi les paquets pré-installés.
Irfy

9

Le script suivant imprimera tous les packages qui ne sont pas configurés pour une 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.


Bravo à vous bien monsieur. Cela fonctionne réellement, contrairement à la réponse acceptée.
Irfy

montrer juste un couple de paquet pour moi --- manque définitivement beaucoup d'entre eux.
Rmano

Idem ici, il manque définitivement des paquets installés manuellement, juste après les avoir installés.
David Ljung Madison

Utiliser sys.exit(1)sans import syspeut entraîner une erreur dans les versions plus récentes de python. Soit import sysou utiliser exit(1).
Videonauth

7

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), aptutilisez 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-installedpour répertorier les packages qui ont été 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 uniquement des commandes utilisateur et de leurs dépendances, 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

Comme plusieurs personnes l'ont commenté, apt-mark showmanual semble être un peu bogué (et je l'ai signalé comme bogue 727799 ). Lorsque 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ù 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.


1
Utiliser sys.exit(1)sans import syspeut entraîner une erreur dans les versions plus récentes de python. Soit import sysou utiliser exit(1).
Videonauth

4

Je voudrais donner une solution graphique.

entrez la description de l'image ici

  1. Ouvert 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 Custom Filterspour savoir si un foobarpaquet a été installé manuellement ou automatiquement.

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


2

Si personne ne vous répond gentiment en utilisant une commande apr-quelque chose, vous pouvez le faire à la dure . 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.


1
Non, j'ai jeté un coup d'œil à ce fichier pour trouver que liferea était marqué comme étant installé automatiquement. J'ai fait un apt-get install lifereaet il n'a pas été installé, mais j'ai obtenu une sortie qui ressemblait à "marquée comme installée manuellement". À présent, liferea est toujours dans le fichier, sauf que la ligne suivante a un 0au lieu de 1. En outre, vous devriez changer votre motif de regex à la " foobar$"place 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 met à jour la réponse juste au cas où.
Javier Rivera

2

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

Vous pouvez utiliser sort -uau lieu de sort | unique. Comme l’ apt-markarchitecture n’a pas été affichée, vous devriez la supprimer de la sortie de dpkg avant les opérations définies (ou leur utilisation dpkg-query -W -f='${Package}\n'). En outre, dpkg peut lister certains paquets qui ne sont pas installés actuellement. En ce qui concerne "desc", vous pouvez utiliser `dpkg-query -W -f = '# $ {binary: Summary} \ n' $ pack, ce qui est plus rapide.
jarno

Oh, apt-markpeut afficher l’architecture de certains paquets, mais pas autant dpkg -l.
Jarno

apt-cache searchest 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

1

Comme l'a dit Li Lo, vous apt-mark showautodevriez avoir 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: il s’agit plus d’une illustration de la façon dont vous allez avoir l’air génial de donner des ordres énormes à 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.

Je doute que cela soit exact, car dpkg affiche souvent des paquetages 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, grep le supprimer, puis le découper en tranches. Je vais essayer.
Oli

comm -3 <(dpkg -l | grep '^ii' | cut -d \ -f 3|sort) <(apt-mark showauto|sort)est bien mieux;)
LassePoulsen

-1

Ceci listera tous les packages installés manuellement sans: dépendances, packages désinstallés, packages installés lors de l'installation du système.

unopts() {
  in=`cat`
  echo "$in" | sed -r 's/ --[^ ]+//g;s/ -[^ ]+//g'
}

list() {
  cat '/var/log/apt/history.log' |
  grep --color=never -v '\-o APT::Status-Fd=4 \-o APT::Keep-Fds::=5 \-o APT::Keep-Fds::=6' |
  egrep --color=never "Commandline: apt-get.* $1" |
  sed -r "s/Commandline: apt-get//;s/ $1//" |
  unopts |
  tr ' ' '\n' |
  sed '/^$/d'
}

hapt() {
  tmp=`mktemp -d`
  installed=$tmp/installed
  deleted=$tmp/deleted
  dpkg=$tmp/dpkg
  list 'install' > $installed
  list '(remove|purge|autoremove)' > $deleted
  dpkg --get-selections |
  grep -v 'deinstall' |
  cut -f 1 > $dpkg
  while read package
  do
    sed -i "0,/$package/{//d;}" $installed
  done < $deleted
  while read package
  do
    if [ -z "`grep --color=never "^$package$" $dpkg`" ]
    then
      sed -i "0,/$package/{//d;}" $installed
    fi
  done < $installed
  cat $installed
  rm -r $tmp
}
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.