Como excluir um pacote do apt-get autoremove?

20

Estou em uma situação em que a lista de pacotes órfãos a serem removidos apt-get autoremoveinclui um pacote que eu quero manter. Aparentemente, removi acidentalmente um pacote que dependia dele. Como posso agora marcar o pacote como explicitamente desejado, para que apt-get autoremoveele não seja removido?

bluenote10
fonte
E a pergunta relacionada: por que é órfã?
precisa saber é o seguinte

Respostas:

29

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

tão

sudo apt-mark manual <package-name>

Agora autoremovenão o removerá.

Desfazer

sudo apt-mark auto <package-name>

Agora autoremove, o pacote será removido se não for uma dependência de nenhum outro pacote.

Zanna
fonte
Outro truque útil é que você pode marcar muitos pacotes de uma vez como este: sudo manual do apt-mark <package1> <package2> <package3> etc
Msencenb
10

Mais algumas tentativas do Google trouxeram uma solução :

É possível apenas instalar explicitamente:

sudo apt-get install <package>

ou marcar como instalado manualmente via

sudo apt-mark manual <package>

apt não será reinstalado, a saída será parecida com:

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

Isso já foi respondido bem, mas eu encontrei uma situação em que não queria "marcar" muitos dos pacotes (e desmarcar depois autoremove).

Quando a lista de pacotes que você deseja remover automaticamente é facilmente definida, você pode canalizar / sed/ xargseles.

Não tenho um exemplo complexo de muitos pacotes, mas se tiver o seguinte cenário:

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.

e quero remover apenas os linux*pacotes, posso fazer isso:

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

Portanto, a partir daqui, é fácil passar esses xargsargumentos como argumentos de linha de comando para o simples apt-get remove -y:

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

Normalmente, ao usar xargs, eu me protegia contra espaços nos argumentos (por exemplo, find ... -print0 | xargs -0 ...), mas como os nomes dos pacotes não têm espaços, eu me sinto à vontade usando argumentos delimitados por nova linha.

(Eu acho que em outras situações, seria mais apropriado "marcar" uma retenção, desatrelar os pacotes. Isso também pode ser feito com expressões regulares e xargs, mas provavelmente está sobrecarregando a situação.)

r2evans
fonte