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

143

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

    
posée Umang 16.08.2010 - 19:07
la source

12 réponses

163

Vous pouvez utiliser l’une ou l’autre de ces deux lignes. Tous deux produisent 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 dans les fissures, bien que je pense que ces sont réellement installés 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 sed supplémentaire supprime les espaces restants à la fin de la ligne.
  2. Obtenez la liste des paquets installés juste après une nouvelle installation.
  3. Comparer les fichiers, ne sortir 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:

  • À la place, utilisez le fichier ubuntu-14.04-desktop-amd64.manifest ( ici pour Ubuntu 14.04) 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, alors que l'autre fichier.

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

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

EDIT: Que faire si vous avez effectué une mise à niveau à partir d'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 fait le fichier initial_status.gz (j'ai coché).

    
réponse donnée jmiserez 06.07.2014 - 17:01
la source
52

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

apt-mark showmanual
    
réponse donnée Daniel Alder 17.05.2012 - 18:21
la source
19

apt-mark showauto | grep -iE '^foobar$' affichera "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. Il est dommage que l'aptitude ne fasse pas partie de l'installation par défaut sur Ubuntu Desktop à partir de 10.10.

    
réponse donnée Li Lo 16.08.2010 - 19:32
la source
11

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 préciser ce que j’ai installé à la main. Mettez 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

Vous ne savez pas si cela correspond à aptitude ou non. Il ne semble pas capter les installations de l’application de bureau Ubuntu Software.

    
réponse donnée s1037989 04.02.2017 - 19:48
la source
8

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

    
réponse donnée txwikinger 16.08.2010 - 21:42
la source
5

Comme plusieurs personnes l’ont dit, apt-mark showmanual semble être un peu bogué (et je l’ai signalé comme étant 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 n'enregistre 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, il s’agissait d’une liste très courte de 5 éléments qui ne semble pas non plus exacte.

    
réponse donnée cluelesscoder 27.10.2013 - 01:28
la source
4

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, soit directement, soit en tant que dépendances.

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

    
réponse donnée Aalok 07.02.2017 - 15:01
la source
2

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 }' | 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/.* - (.*)//')
    date=$(date -r /var/lib/dpkg/info/$pack.list)

    echo "# $desc"
    echo "# $date"
    echo "sudo apt-get install $pack"
    echo -e ""
done
    
réponse donnée dufferZafar 31.05.2015 - 22:28
la source
1

Comme Li Lo l’a dit, apt-mark showauto devrait vous faire une liste complète de choses installées automatiquement.

Maintenant, pour montrer les choses qui sont installées manuellement, il s’avère qu’il existe 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: Il s’agit plutôt d’une illustration de la façon dont vous regarderez les 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 interrogeons tout d'abord dpkg pour obtenir la liste des paquets installés.
  • Nous filtrons ceux qui sont réellement installés (pas seulement la configuration résiduelle)
  • Nous supprimons le statut
  • Nous comparons cette liste avec la liste automatisée de apt-mark
  • Nous sortons parce que nous le pouvons.
réponse donnée Oli 16.08.2010 - 19:41
la source
1

Si personne ne vous donne une bonne réponse en utilisant une commande apr-something, vous pouvez le faire de façon hard . 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. Il n'est pas supprimé.

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

    
réponse donnée Javier Rivera 16.08.2010 - 19:44
la source
0

Je voudrais donner une solution graphique.

  1. Ouvrez 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 package foobar était installé manuellement ou automatiquement.

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

    
réponse donnée blueray 28.05.2018 - 17:39
la source
-1

Cela listera tous les paquets installés manuellement sans: dépendances, paquets 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.* " |
  sed -r "s/Commandline: apt-get//;s/ //" |
  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
}
    
réponse donnée wieczorek1990 08.10.2014 - 15:39
la source

Lire d'autres questions sur les étiquettes