Es gibt viele Möglichkeiten, manuell installierte Pakete mit apt
anzuzeigen , wie zum Beispiel:
apt-mark showmanual
Aber manchmal ist diese Leistung zu viel. Zum Beispiel, wenn der Benutzer das Paket foo
manuell installiert hat :
apt-get install foo
…und foo
abhängig von bar
und baz
, dann apt-mark showmanual
würde ausgeben:
bar
baz
foo
Wie können wir nur die manuell installierten Pakete der obersten Ebene auflisten (d.h. foo
) ohne ihre Abhängigkeiten (d.h. nicht baz
, noch bar
)?
Der folgende Code scheint zu funktionieren, aber GNU parallel
Aufruf von apt-rdepends
ein paar hundert Mal ist zu langsam, (drei Stunden mit einer 4-Kern-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
Akzeptierte Antwort:
Dies könnte mit der Python apt API erfolgen. Die Pakete sehen Sie in apt-mark showmanual
sind genau die in apt.cache.Cache()
für die is_installed
ist ist wahr und is_auto_installed
ist falsch. Aber es ist einfacher, die Abhängigkeiten zu verarbeiten:
#! /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))
Sogar diese listet einige Pakete auf, die ich dort nicht erwarten würde (init
, grep
?!).