Ci sono molti modi per mostrare i pacchetti installati manualmente usando apt
, come:
apt-mark showmanual
Ma a volte quell'output è troppo. Ad esempio, se l'utente ha installato manualmente il pacchetto foo
:
apt-get install foo
…e foo
dipendeva da bar
e baz
, quindi apt-mark showmanual
produrrebbe:
bar
baz
foo
Come possiamo elencare solo i pacchetti installati manualmente di livello superiore (cioè foo
) senza le loro dipendenze (ovvero non baz
, né bar
)?
Il codice seguente sembra funzionare, ma GNU parallel
chiamando apt-rdepends
qualche centinaio di volte è troppo lento, (tre ore con una CPU a 4 core):
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
Risposta accettata:
Questo potrebbe essere fatto usando l'API Python apt. I pacchetti che vedi in apt-mark showmanual
sono esattamente quelli in apt.cache.Cache()
per cui is_installed
è vero e is_auto_installed
è falso. Ma è più facile elaborare le dipendenze:
#! /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))
Anche questo elenca alcuni pacchetti che non mi aspetterei di vedere lì (init
, grep
?!).