Es gibt viele Möglichkeiten, manuell installierte Pakete anzuzeigen apt
, z. B.:
apt-mark showmanual
Aber manchmal ist diese Ausgabe zu viel. Zum Beispiel, wenn der Benutzer das Paket manuell installiert hat foo
:
apt-get install foo
... und foo
hing davon ab bar
und würde baz
dann apt-mark showmanual
ausgeben:
bar
baz
foo
Wie können wir nur die manuell installierten Pakete der obersten Ebene ( dh foo
) ohne ihre Abhängigkeiten ( dh nicht baz
oder noch bar
) auflisten?
Der folgende Code scheint zu funktionieren, aber ein paar hundert Mal GNU- parallel
Aufrufe apt-rdepends
sind 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
Antworten:
Dies kann mithilfe der Python apt-API erfolgen. Die Pakete
apt-mark showmanual
, inapt.cache.Cache()
denen Sie sehen, sind genau diejenigen, für dieis_installed
wahr undis_auto_installed
falsch ist. Es ist jedoch einfacher, die Abhängigkeiten zu verarbeiten:Auch hier sind einige Pakete aufgeführt, die ich dort nicht erwarten würde (
init
,grep
?!).quelle
init
undgrep
(möglicherweise sind Ihre passenden Daten beschädigt?) Auch zu viele Bibliotheken. OTOH, in meinem 3-Stunden-Code fehlen einige Elemente, die vorhanden sein sollten, Elemente, die mit dem obigenpython
Code gedruckt werden. Möglicherweise wurden die fehlenden Elemente nicht mit installiertapt
.python
Code ist 3600-mal schneller (dh es dauerte 3 Sekunden) als mein Code (3 Stunden). Ich freue mich darauf, die rekursive Version zu testen ...Das folgende Shell-Skript sucht nach den übergeordneten Elementen aller installierten Abhängigkeiten.
Ich habe
tsort
in diesem Skript verwendet. Ich gehe davon aus, dass beim Hinzufügen eines Markers am Ende ohne Abhängigkeiten der Marker auch der letzte Eintrag ohne Abhängigkeiten in meinem Ergebnis ist. So kann ich zwischen dem letzten Paket ohne Abhängigkeiten und dem ersten Paket mit Abhängigkeiten unterscheiden.Bei dieser Lösung ist mir ein Problem aufgefallen:
Das Abhängigkeitsdiagramm enthält Zyklen. Diese Einträge werden von ignoriert
tsort
.quelle
Sie können alle manuell installierten Pakete ohne ihre erste Abhängigkeitsebene wie folgt finden:
Sie können auch die folgende Einzeiler-Magie verwenden:
quelle
dasher
Paket. Auf meinem System verrohrt der OP - Code durchsort -V
Ausgänge 475 Zeilen, muru der Code - Ausgänge 914 Zeilen (einschließlichdasher
), und dieser Code gibt die Antwort 995 Zeilen.