如何获取被阻止升级的已安装软件包列表?

最近,我需要获取在我的Ubuntu系统上安装的并且被标记为“hold”状态的软件包列表。
软件包的“hold”状态意味着当操作系统升级时,安装程序不会自动升级这些软件包,除非在选项中明确指定。
我正在寻找一个命令行解决方案,但也了解到这可能在图形界面中实现。

有不同的选项可以做到这一点...其中大部分也在https://askubuntu.com/a/18656/354350上列出。 - DJCrashdummy
取消所有被保留的软件包:sudo apt-mark unhold $(apt-mark showhold) - sondra.kinsey
5个回答

你可以使用 apt-mark:
apt-mark showhold

这将显示处于“保持”状态的软件包,以便软件包管理器不会自动升级这些软件包。
来自《man apt-mark》的说明:
showhold
           showhold is used to print a list of packages on hold

12只显示系统有被阻止的软件包,但是需要找到更根本的解决方法。 - mathtick
2刚刚升级到了Xubuntu 20.04.1桌面版,并进行了全新安装。我遇到了相同的问题 --> "lib32z1: 依赖于libc6-i386(>= 2.4),但无法安装 E: 无法修复问题,您有损坏的软件包。" apt-mark showhold 返回为空。 - BISI

使用dpkg
dpkg -l | grep "^hi"
-l 的意思是列出所有的软件包,然后通过管道传递给 grep。
正则表达式 "^hi" 的意思是搜索以 "hi" 开头的所有行,这是 "hold" 和 "installed" 的首字母缩写。
默认情况下,dpkg -l 会列出状态、软件包名称、版本、架构和简短描述。

1无论使用哪种高级包装器,这种方法都适用于Debian系统,因此更加通用。 - uDude
2当系统出现可疑情况时,我经常使用dpkg -l | grep --invert-match "^ii"来检查我的系统。这个命令会列出所有未按照正常安装的软件包。 - DJCrashdummy
@DJCrashdummy: 我也发现了很多软件包的状态是ri而不是ii。所有这些问题都可以通过sudo apt install --reinstall package-name来修复。你知道是什么原因导致了这些问题吗? - Mikko Rantalainen
1@MikkoRantalainen 在 dpkg -l 的输出顶部,你会看到一些关于输出的解释... ii 表示该软件包当前已经安装(第二个字母),并且应该保持安装(第一个字母)。ri 表示该软件包当前已经安装(第二个字母),但应该被移除/卸载(第一个字母),但保留配置。- 所以我不确定你要“修复”什么。**||** 真正的错误会通过第三个字母来指示,或者如果第二个字母是 FH,我也会进一步调查一下。 - DJCrashdummy
为什么一个包裹会进入状态ri,而我并没有请求将该包裹移除? - Mikko Rantalainen
@MikkoRantalainen 嗯...这终于超出了对一个或多个无关问题/答案的评论范围(也许提出一个更详细信息的单独问题会更合理),但我猜可能是依赖关系...?:-D - DJCrashdummy
这也是为什么大多数情况下普通用户应该使用Synaptic、apt或aptitude而不是dpkg的原因,除非他们的发行版提供了一个完全简单的软件包管理器或应用商店。 - DJCrashdummy
我将新问题分叉到https://askubuntu.com/q/1352226/50254。 - Mikko Rantalainen

作为替代,您还可以使用dpkg --get-selections
dpkg --get-selections | grep "\<hold$"

dpkg --get-selections列出所有已安装软件包的状态,grep "\<hold$"只显示以单词"hold"结尾的行。

如果你正在寻找异常情况,特别是如果上述未显示任何有用信息,以下内容可能也会有所帮助。

dpkg --get-selections | grep --invert-match "\<install$"

这显示了所有不仅仅安装的行/包。

在apt-mark版本> 2.4中,您必须使用以下命令:

apt-mark showhold

此外,它是一个老工具aptitude在命令行上表现出色,你可以轻松浏览整个软件包。
aptitude

输入 u 更新软件包,然后按下 g,您将看到被保留的软件包。


要取消所有被保留的软件包,请使用以下命令:sudo apt-mark unhold $(apt-mark showhold)

1这并没有回答问题。 - Paddy Landau
2我来到这里是因为我在搜索如何解除包裹的保留状态。随意删除我的回答,那些因同样原因而来到这里的人仍然会感到困惑。这并不是为了回答问题,因为前面的回答已经做到了。此外,人们需要找出被保留的包裹的原因很可能是为了解除保留状态。我的回答只是帮助他们找到下一步该如何操作的方法。 - xpt
这应该是一个评论,而不是一个答案。 - sondra.kinsey