Istnieje wiele sposobów wyświetlania pakietów instalowanych ręcznie apt
, na przykład:
apt-mark showmanual
Ale czasami ta wydajność jest zbyt duża. Na przykład, jeśli użytkownik ręcznie zainstalował pakiet foo
:
apt-get install foo
... i foo
od tego zależało bar
i baz
, wtedy apt-mark showmanual
byłoby wyjście:
bar
baz
foo
Jak możemy wyświetlić listę ręcznie zainstalowanych pakietów najwyższego poziomu ( tj. foo
) Bez ich zależności ( tj. Nie baz
, ani bar
)?
Poniższy kod wydaje się działać, ale wywołanie GNU kilkaset razy jest zbyt wolne (trzy godziny z czterordzeniowym procesorem):parallel
apt-rdepends
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
Odpowiedzi:
Można to zrobić za pomocą API apt Pythona. Pakiety, które widzisz,
apt-mark showmanual
są dokładnie tymi, wapt.cache.Cache()
którychis_installed
jest to prawda iis_auto_installed
fałsz. Ale łatwiej jest przetwarzać zależności:Nawet ta lista zawiera niektóre pakiety, których nie spodziewałbym się tam zobaczyć (
init
,grep
?!).źródło
init
igrep
(może twoje apt dane są uszkodzone?), Również pokazuje zbyt wiele bibliotek. OTOH, mój 3-godzinny kod pomija kilka elementów, które powinny tam być, elementy, którepython
drukuje powyższy kod. Być może brakujące elementy nie zostały zainstalowaneapt
.python
kod jest 3600 razy szybszy (tj. Zajął 3 sekundy) niż mój kod (3 godziny). Czekamy na przetestowanie wersji rekurencyjnej ...Poniższy skrypt powłoki wyszukuje rodziców wszystkich zainstalowanych zależności.
Użyłem
tsort
w tym skrypcie. Zakładam, że podczas dodawania znacznika na końcu bez zależności znacznik będzie również ostatnim wpisem bez zależności w moim wyniku. Mogę więc odróżnić ostatni pakiet bez zależności od pierwszego pakietu z zależnościami.Zauważyłem jeden problem z tym rozwiązaniem:
na wykresie zależności występują cykle. Te wpisy są ignorowane przez
tsort
.źródło
Wszystkie ręcznie zainstalowane pakiety bez ich pierwszego poziomu zależności można znaleźć w następujący sposób:
Możesz także użyć następującej magii jedno-liniowej:
źródło
dasher
pakiet. W moim systemie kod OP przepływał przezsort -V
wyjścia 475 linii, kod Muru wyprowadza 914 linii (włączniedasher
), a kod odpowiedzi odpowiada 995 linii.