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


20

我处于一种情况,要删除的孤立软件包列表中apt-get autoremove包含我要保留的软件包。显然我不小心删除了一个依赖它的包装。我现在如何才能按明确希望的方式标记该软件包,从而apt-get autoremove不会将其删除?


还有一个相关的问题:为什么它是孤儿?
bluenote10年

Answers:


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.

0

这已经被很好地回答了,但是我发现我不想对许多软件包进行“标记”(然后在之后取消标记autoremove)。

当你的包的列表来的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作为命令行参数传递给simple 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 ...),但是由于包名称中没有空格,因此我很乐意使用以换行符分隔的参数。

(我认为在其他情况下,更合适的做法是“标记”保留,解除保留软件包。这也可以通过regexes和来完成xargs,但可能会过度设计这种情况。)

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.