如何从apt-get autoremove中排除一个软件包?

我现在遇到一个情况,使用apt-get autoremove命令删除孤立的软件包列表中包含了一个我想保留的软件包。显然,我不小心删除了一个依赖于它的软件包。我该如何将这个软件包标记为明确需要的,以便apt-get autoremove不会删除它?

而且还有一个相关的问题:为什么它被遗弃了? - bluenote10
3个回答

使用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将会移除它。

2另一个方便的技巧是你可以像这样一次性标记多个软件包:sudo apt-mark manual <package1> <package2> <package3> 等等。 - Msencenb

再试几次谷歌搜索,找到了一个解决方案
要么只需明确安装:
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.

这个问题已经得到了很好的回答,但我发现有一种情况,我不想在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来实现,但可能过度设计了这种情况。)