Hay muchas formas de mostrar paquetes instalados manualmente usando apt
, como:
apt-mark showmanual
Pero a veces esa salida es demasiado. Por ejemplo, si el usuario instaló manualmente el paquete foo
:
apt-get install foo
…y foo
dependía de bar
y baz
, luego apt-mark showmanual
generaría:
bar
baz
foo
¿Cómo podemos enumerar solo los paquetes de nivel superior instalados manualmente (es decir, foo
) sin sus dependencias (es decir, no baz
, ni bar
)?
El siguiente código parece funcionar, pero GNU parallel
llamando a apt-rdepends
unos cientos de veces es demasiado lento (tres horas con una CPU de 4 núcleos):
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
Respuesta aceptada:
Esto podría hacerse usando la API apt de Python. Los paquetes que ve en apt-mark showmanual
son exactamente los que están en apt.cache.Cache()
para el cual is_installed
es verdadero y is_auto_installed
Es falso. Pero es más fácil procesar las dependencias:
#! /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))
Incluso esto enumera algunos paquetes que no esperaría ver allí (init
, grep
?!).