¿Cómo excluir un paquete de apt-get autoremove?

20

Estoy en una situación en la que la lista de paquetes huérfanos que se eliminarán apt-get autoremoveincluye un paquete que quiero conservar. Aparentemente, eliminé accidentalmente un paquete que dependía de él. ¿Cómo puedo marcar ahora el paquete como lo apt-get autoremovedeseo explícitamente, para que no lo elimine?

bluenote10
fuente

Respuestas:

29

Utilizar 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.

Entonces

sudo apt-mark manual <package-name>

Ahora autoremoveno lo eliminará.

Deshacer

sudo apt-mark auto <package-name>

Ahora autoremoveeliminará el paquete si no es una dependencia de ningún otro paquete.

Zanna
fuente
Otro truco útil es que puede marcar muchos paquetes a la vez de esta manera: sudo apt-mark manual <package1> <package2> <package3> etc.
Msencenb
10

Algunos intentos más de Google trajeron una solución :

Es posible instalarlo explícitamente:

sudo apt-get install <package>

o marcado como instalado manualmente a través de

sudo apt-mark manual <package>

apt no se reinstalará, la salida se verá así:

$ 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
fuente
0

Esto ya se respondió bien, pero encontré una situación en la que no quería "marcar" muchos de los paquetes (y luego desmarcarlos después autoremove).

Cuando la lista de paquetes que desee está definida fácilmente a autoremove, a continuación, se puede canalizar / sed/ xargshacia fuera.

No tengo un ejemplo complejo de muchos paquetes, pero si tengo el siguiente escenario:

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.

y quiero eliminar solo los linux*paquetes, puedo hacer esto:

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

Entonces, desde aquí, es fácil pasarlos xargscomo argumentos de línea de comandos a lo simple apt-get remove -y:

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

Normalmente cuando lo uso xargs, me protegería de los espacios en los argumentos (por ejemplo, find ... -print0 | xargs -0 ...), pero como los nombres de los paquetes no tienen espacios en ellos, me siento cómodo usando argumentos delimitados por una nueva línea.

(Creo que en otras situaciones, sería más apropiado "marcar" una retención, deshacer los paquetes. Eso también se puede hacer con expresiones regulares y xargs, pero es probable que exagere la situación).

r2evans
fuente