Il existe de nombreuses façons d'afficher les packages installés manuellement à l'aide de apt
, tels que :
apt-mark showmanual
Mais parfois, cette sortie est trop. Par exemple, si l'utilisateur a installé manuellement le package foo
:
apt-get install foo
…et foo
dépendait de bar
et baz
, puis apt-mark showmanual
afficherait :
bar
baz
foo
Comment pouvons-nous répertorier uniquement les packages installés manuellement de haut niveau (c'est-à-dire foo
) sans leurs dépendances (c'est-à-dire pas baz
, ni bar
) ?
Le code suivant semble fonctionner, mais GNU parallel
appeler apt-rdepends
quelques centaines de fois, c'est trop lent (trois heures avec un processeur à 4 cœurs) :
apt-mark showmanual |
tee /tmp/foo |
parallel "apt-rdepends -f Depends,PreDepends,Suggests,Recommends {} |
tail +2" 2> /dev/null |
tr -s ' ' 'n' |
grep -v '[():]' |
sort -Vu |
grep -wv -f - /tmp/foo
Réponse acceptée :
Cela pourrait être fait en utilisant l'API Python apt. Les packages que vous voyez dans apt-mark showmanual
sont exactement ceux de apt.cache.Cache()
pour lequel is_installed
est vrai et is_auto_installed
c'est faux. Mais, il est plus simple de traiter les dépendances :
#! /usr/bin/env python3
from apt import cache
manual = set(pkg for pkg in cache.Cache() if pkg.is_installed and not pkg.is_auto_installed)
depends = set(dep_pkg.name for pkg in manual for dep in pkg.installed.get_dependencies('PreDepends', 'Depends', 'Recommends') for dep_pkg in dep)
print('n'.join(pkg.name for pkg in manual if pkg.name not in depends))
Même ceci répertorie certains packages que je ne m'attendrais pas à y voir (init
, grep
?!).