Existuje mnoho způsobů, jak zobrazit balíčky nainstalované ručně pomocí apt
, například:
apt-mark showmanual
Ale někdy je ten výstup příliš velký. Například pokud uživatel ručně nainstaloval balíček foo
:
apt-get install foo
…a foo
závisí na bar
a baz
a poté apt-mark showmanual
bude výstup:
bar
baz
foo
Jak můžeme uvést pouze ručně nainstalované balíčky nejvyšší úrovně (tj. foo
) bez jejich závislostí (tj. ne baz
, ani bar
)?
Zdá se, že následující kód funguje, ale GNU parallel
volání apt-rdepends
několik setkrát je příliš pomalé (tři hodiny se 4jádrovým CPU):
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
Přijatá odpověď:
To lze provést pomocí Python apt API. Balíčky, které vidíte v apt-mark showmanual
jsou přesně ty v apt.cache.Cache()
pro který is_installed
je true a is_auto_installed
je nepravdivé. Ale je jednodušší zpracovat závislosti:
#! /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))
I zde jsou uvedeny některé balíčky, které bych tam nečekal (init
, grep
?!).