Wie kann ich ein Paket von apt-get autoremove ausschließen?

20

Ich bin in einer Situation, in der die Liste der verwaisten Pakete, die entfernt werden sollen, apt-get autoremoveein Paket enthält, das ich behalten möchte. Anscheinend habe ich versehentlich ein Paket entfernt, das davon abhing. Wie kann ich nun das Paket als explizit gewünscht markieren, damit apt-get autoremovees nicht entfernt wird?

bluenote10
quelle

Antworten:

29

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

So

sudo apt-mark manual <package-name>

Jetzt autoremovewird es nicht entfernt.

Rückgängig machen

sudo apt-mark auto <package-name>

Jetzt autoremovewird das Paket entfernt, wenn es nicht von einem anderen Paket abhängig ist.

Zanna
quelle
Ein weiterer nützlicher Trick ist, dass Sie viele Pakete auf einmal so markieren können: sudo apt-mark manual <package1> <package2> <package3> etc
Msencenb
10

Ein paar weitere Google-Versuche brachten eine Lösung :

Es ist entweder möglich, nur explizit zu installieren:

sudo apt-get install <package>

oder als manuell installiert markieren über

sudo apt-mark manual <package>

apt wird nicht erneut installiert, die Ausgabe sieht einfach so aus:

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

Dies ist bereits gut beantwortet, aber ich fand eine Situation, in der ich viele der Pakete nicht "markieren" wollte (und sie danach wieder abmelden wollte autoremove).

Wenn die Liste der Pakete , die Sie wollen zu autoremove ist leicht definiert, dann können Sie Rohr / sed/ xargssie aus.

Ich habe kein komplexes Beispiel für viele Pakete, aber wenn ich das folgende Szenario habe:

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.

und ich möchte nur die linux*Pakete entfernen , ich kann dies tun:

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

Von hier aus ist es einfach, diese xargsals Kommandozeilenargumente an das simple zu übergeben apt-get remove -y:

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

Normalerweise xargswürde ich mich bei der Verwendung vor Leerzeichen in den Argumenten schützen (z. B. find ... -print0 | xargs -0 ...), aber da Paketnamen keine Leerzeichen enthalten, kann ich problemlos Argumente mit Zeilenumbrüchen verwenden.

(Ich würde es für andere Situationen halten, es wäre sinnvoller, ein Hold zu "markieren", das die Pakete auspackt. Das geht auch mit Regexes und xargs, ist aber wahrscheinlich eine Überentwicklung der Situation.)

r2evans
quelle