Как исключить пакет из apt-get autoremove?

20

Я нахожусь в ситуации, когда список потерянных пакетов, которые нужно удалить, apt-get autoremoveвключает в себя пакет, который я хочу сохранить. Очевидно, я случайно удалил пакет, который зависел от него. Как я могу теперь пометить пакет как явно желаемый, чтобы apt-get autoremoveне удалить его?

bluenote10
источник

Ответы:

29

использование 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.

Так

sudo apt-mark manual <package-name>

Теперь autoremoveне буду его удалять.

Отменить

sudo apt-mark auto <package-name>

Теперь autoremoveудалит пакет, если он не является зависимостью от какого-либо другого пакета.

Занна
источник
Еще один полезный трюк заключается в том, что вы можете пометить сразу несколько пакетов следующим образом: руководство sudo apt-mark <package1> <package2> <package3> и т. Д.
Msencenb
10

Еще несколько попыток Google привели к решению :

Можно либо просто установить явно:

sudo apt-get install <package>

или маркировка как установленная вручную через

sudo apt-mark manual <package>

apt не будет переустанавливаться, вывод будет выглядеть так:

$ 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
источник
0

На этот вопрос уже получен хороший ответ, но я обнаружил ситуацию, в которой я не хотел «помечать» многие пакеты (а затем снимать их после отметки autoremove).

Когда список пакетов, которые вы хотите автоматически удалить, легко определить, вы можете / sed/ xargsпередать их.

У меня нет сложного примера многих пакетов, но если у меня есть следующий сценарий:

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.

и я хочу удалить только linux*пакеты, я могу сделать это:

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

Итак, отсюда легко передать их через xargsаргументы командной строки простым apt-get remove -y:

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

Обычно при использовании xargsя бы защищал от пробелов в аргументах (например, find ... -print0 | xargs -0 ...), но так как в именах пакетов нет пробелов, я спокойно использую аргументы с разделителями новой строки.

(Я думаю, что в других ситуациях было бы более уместно «пометить» удержание, открепить пакеты. Это также может быть сделано с помощью регулярных выражений и xargs, но, вероятно, чрезмерно сконструировало ситуацию.)

r2evans
источник