问题陈述
apt 和 aptitude 都会记住安装了哪些软件包自动地作为某些其他包的依赖项或手动因为某些原因。由于种种原因,名单手动包可能会变得不必要的大,并且随着时间的推移会开始累积。仅当有特别要求时才会卸载这些软件包。
一个常见的例子是库软件包,由于某种原因可能会作为修补程序安装,但稍后一旦安装了依赖于它们的某些软件,它们可能会被标记为自动安装。但是,如果没有发生这种情况,即使卸载了依赖于它们的软件包,它们也将保持安装状态。在某些情况下,类似的工具deborphan
可能会找到这些剩余的包,但它们必须进行很多猜测,而且这不是一个系统的解决方案。
可能的解决方案的描述
这就是为什么我正在寻找一种方法来查找此类可以标记为自动安装的软件包,而不会导致它们被卸载。这意味着查找当前标记为手动安装的软件包,但它们是某些其他已安装软件包的依赖项(或推荐的依赖项)。然后可以将这些包标记为自动地安装并在其他软件不再需要时将其删除。
我想我也许可以制作一个类似的工具libapt 的 Python 绑定,但如果类似的东西已经存在,我不想重新发明轮子。
答案1
搜索手动安装的包,以及作为已安装包的强制或推荐依赖项的包。资质可以做到这一点。
aptitude search -q -F %p '?installed !?automatic (?reverse-depends(?installed .*) | ?reverse-recommends(?installed .*))'
我认为没有办法表明为每个包找到了哪些依赖项。如果您想要这些信息,Python 就是您的最佳选择。这个非常快速和肮脏的脚本似乎可以做到这一点(大多数情况下,我认为在一些涉及析取、版本依赖、预依赖等的非直接情况下它可能是不正确的)。
#!/usr/bin/env python2
import apt
packages = apt.Cache()
covered = {}
# Inverse dependency computation: for each installed package, record which
# packages require it (as Depends: or Recommends:).
for p in packages:
if p.installed:
for l in p.installed.dependencies + p.installed.recommends:
for d in l:
if packages.has_key(d.name) and packages[d.name].installed:
if not covered.has_key(d.name):
covered[d.name] = []
covered[d.name] += [p.name]
# Print out the manually installed packages that are required by another
# installed package, as well as the requiring package(s).
for p in sorted(covered.keys()):
if not packages[p].is_auto_installed:
print(' '.join([p] + covered[p]))
答案2
apt
包管理器提供了一种简单的方法来查找这些包apt-mark
:
# apt-mark showmanual
这将显示所有标记为手动安装的软件包。您可以使用以下命令将其中任何一个更改为自动:
# apt-mark auto PACKAGE_NAME
来自apt-mark 手册页:
汽车
auto 用于将一个软件包标记为自动安装,当不再有手动安装的软件包依赖于该软件包时,这将导致该软件包被删除。
手动的
Manual 用于将软件包标记为手动安装,这将防止在没有其他软件包依赖于该软件包的情况下自动删除该软件包。
汽车展
showauto 用于打印自动安装的软件包列表,每个软件包另起一行。如果没有给出包,将列出所有自动安装的包。如果提供了软件包,则仅显示自动安装的软件包。
演出手册
showmanual 的使用方式与 showauto 相同,只不过它会打印手动安装的软件包列表。