Jak wykluczyć pakiet z apt-get autorove?

20

Jestem w sytuacji, w której lista osieroconych pakietów, które należy usunąć, apt-get autoremovezawiera pakiet, który chcę zachować. Najwyraźniej przypadkowo usunąłem pakiet, który był od niego zależny. Jak mogę teraz oznaczyć pakiet jako wyraźnie pożądany, aby go apt-get autoremovenie usunąć?

bluenote10
źródło

Odpowiedzi:

29

Posługiwać się apt-mark

$ man apt-mark
...
manual
       manual is used to mark a package as being manually installed, which will 
prevent the package from being automatically removed if no other packages 
depend on it.

Więc

sudo apt-mark manual <package-name>

Teraz autoremovego nie usunie.

Cofnąć

sudo apt-mark auto <package-name>

Teraz autoremoveusunie pakiet, jeśli nie jest zależny od żadnego innego pakietu.

Zanna
źródło
Inną przydatną sztuczką jest to, że możesz oznaczyć wiele pakietów jednocześnie: sudo apt-mark manual <package1> <package2> <package3> itp.
Msencenb
10

Kilka kolejnych prób Google'a przyniosło rozwiązanie :

Można albo po prostu zainstalować jawnie:

sudo apt-get install <package>

lub oznaczenie jako instalowane ręcznie przez

sudo apt-mark manual <package>

apt nie zostanie ponownie zainstalowany, dane wyjściowe będą wyglądać następująco:

$ sudo apt-get install tmux
Reading package lists... Done
Building dependency tree       
Reading state information... Done
tmux is already the newest version.
tmux set to manually installed.
bluenote10
źródło
0

Odpowiedź jest już dobrze udzielona, ​​ale znalazłem sytuację, w której nie chciałem „zaznaczać” wielu paczek (a następnie je odznaczać po autoremove).

Gdy lista pakietów Państwo chcą do autoremove łatwo zdefiniowane, to można rura / sed/ xargsje.

Nie mam złożonego przykładu wielu pakietów, ale jeśli mam następujący scenariusz:

root@fptc-rsvrd:~# apt-get autoremove
Reading package lists... Done
Building dependency tree
Reading state information... Done
The following packages will be REMOVED:
  libluajit-5.1-2 libluajit-5.1-common linux-headers-4.4.0-141 linux-headers-4.4.0-141-generic linux-headers-4.4.0-143 linux-headers-4.4.0-143-generic linux-headers-4.4.0-146 linux-headers-4.4.0-146-generic
  linux-image-4.4.0-141-generic linux-image-4.4.0-143-generic linux-image-4.4.0-146-generic linux-image-extra-4.4.0-141-generic linux-modules-4.4.0-143-generic linux-modules-4.4.0-146-generic
  linux-modules-extra-4.4.0-143-generic linux-modules-extra-4.4.0-146-generic linux-signed-image-4.4.0-141-generic pandoc-data
0 upgraded, 0 newly installed, 18 to remove and 19 not upgraded.
After this operation, 907 MB disk space will be freed.

i chcę usunąć tylko linux*pakiety, mogę to zrobić:

root@fptc-rsvrd:~# apt-get autoremove -s | sed -ne 's/Remv \(linux[^[]*\)\[.*/\1/gp'
linux-headers-4.4.0-141-generic
linux-headers-4.4.0-141
linux-headers-4.4.0-143-generic
linux-headers-4.4.0-143
linux-headers-4.4.0-146-generic
linux-headers-4.4.0-146
linux-signed-image-4.4.0-141-generic
linux-image-extra-4.4.0-141-generic
linux-image-4.4.0-141-generic
linux-modules-extra-4.4.0-143-generic
linux-image-4.4.0-143-generic
linux-modules-extra-4.4.0-146-generic
linux-image-4.4.0-146-generic
linux-modules-4.4.0-143-generic
linux-modules-4.4.0-146-generic

Odtąd łatwo jest przekazać je xargsjako argumenty wiersza poleceń do prostej apt-get remove -y:

apt-get autoremove -s \
  | sed -ne 's/Remv \(linux[^[]*\)\[.*/\1/gp' \
  | xargs apt-get remove -y

Zwykle podczas używania xargschroniłbym przed spacjami w argumentach (np. find ... -print0 | xargs -0 ...), Ale ponieważ w nazwach pakietów nie ma spacji, wygodnie jest używać argumentów rozdzielanych znakiem nowej linii.

(Pomyślałbym, że w innych sytuacjach, bardziej odpowiednie byłoby „zaznaczenie” wstrzymania, wycofanie pakietów. Można to również zrobić za pomocą wyrażeń regularnych i xargs, ale prawdopodobnie jest to nadmierna inżynieria sytuacji).

r2evans
źródło