如何获得过时的软件包列表?


19

我试图找出一种方法来获取已启用的存储库中不再可用的软件包列表。该工作站已经通过了许多版本的Ubuntu,并且已经添加和删除了许多第三方存储库。我想从这些已删除的存储库中获取我拥有的软件列表,以便我可以清理它或重新添加适当的存储库。

Answers:


23
aptitude search '~o'

Aptitude提供了一些非常强大的搜索功能。不幸的是,语法有点笨拙,您必须仔细阅读手册页才能找到文档,但这是值得的。

apt-show-versions也可能有帮助:

apt-show-versions | grep 'No available version'

1
看到过时的包,一个很好的文章在这里:raphaelhertzog.com/2011/02/07/...
圣路易斯

另一个有用的列表由apt-show-versions | grep "newer than version in archive"
Sean

我认为apt-show-versions是最好的,这仅仅是因为智能线很难记住。每当我需要它时,我都必须对其进行搜索/查找/保存/编写脚本等。
j riv

6

要获取不在注册存储库或PPA中的应用程序列表,请执行以下操作:

sudo apt-get install apt-show-versions
apt-show-versions | grep 'No available version'

那应该输出这样的文本:

app1 1.0.0.14 installed: No available version in archive
app23 0.3.6 installed: No available version in archive
app332 7.0.9377 installed: No available version in archive

对我来说,这很有效,并显示了我使用DEB软件包安装的三个应用程序,在Repo或PPA中不可用。

请记住,尽管不可能检查所有程序,仅检查经过的程序dpkg。例如,某些应用程序只需将它们解压缩到正确的文件夹中即可安装,而其他应用程序则使用独立的安装程序bin或脚本。因此,最好的方法是让您自己保留通过APT以外的任何其他方式安装的应用程序的列表。


适用于我所有本地dpkg安装的软件包。一个例外。它列出了skype-bin,而apt-cache policy skype-bin清楚地显示了Canonical合作伙伴存储库。我不确定发生了什么。多体系结构问题?仍为+1 apt-show-versions
gertvdijk

aptitude将这些称为“过时”软件包。参见上面的慢性炎评论。
Henk Poley13年

5

如果您已经安装了智能功能

aptitude search '?obsolete'

或其缩写

aptitude search '~o'

这是一个示例输出

i A gcc-4.7-base - GCC, the GNU Compiler Collection (base package)
id  libdb4.7     - Berkeley v4.7 Database Libraries [runtime]
i   libudev0     - libudev shared library

每行的第一个字符表示软件包的当前状态。最常见的状态是:

  • p,表示系统上不存在该程序包的痕迹,
  • c,表示该软件包已删除,但其配置文件保留在系统上,
  • i,表示已安装软件包,并且
  • v,表示该软件包是虚拟的。

第二个字符表示要在包装上执行的已存储操作(如果有),否则显示空白。最常见的操作是:

  • i,表示将安装该软件包,
  • d,表示该软件包将被删除,并且
  • p,表示该软件包及其配置文件将被删除。

如果第三个字符是A,则表示该软件包已自动安装。

有关可能的状态和操作标志的完整列表,请参阅《适用性参考指南》中的“ 访问软件包信息 ”部分。


1
aptitude search ?obsolete也许可以使用bash,但是您应该使用aptitude search '?obsolete'
AB

您能否添加一些解析输出的详细信息?
年长者极客

“?过时”与“〜o”不同吗?
肖恩

@Sean不,他们没有什么不同。〜o是确实过时的缩写。
德米丝·帕尔玛

引号由外壳解析。我认为AB的意思是您不应在命令行中传递未转义的怪异字符,因为您不知道您的Shell将如何处理它们。
肖恩

2

从Ubuntu 19.10开始,也可以运行

apt list ?obsolete

获取过时的软件包列表。

对于任何发行版,您都可以使用以下Bash一线式:

comm -23 <(dpkg-query -W -f '${db:Status-Abbrev}\t${Package}\n' | grep '^.[^nc]' | cut -f2 | sort) <(apt-cache dumpavail | sed -rn 's/^Package: (.*)/\1/p' | sort -u)

无需为此安装额外的软件包,而且此过程相对较快。这还将找到部分安装的软件包(但不会找到仅剩下配置文件的软件包;但是可以轻松更改)。注意:这与软件包的体系结构无关。

如果要包括安装的版本与存储库中可用版本不同的软件包,则可以执行以下操作之一:

使用现代apt:

 apt list --installed | awk -F/ '/\[installed,local\]/{print $1}'

另一个选择是运行

ubuntu-support-status --show-unsupported

并在“不再可下载:”部分下阅读软件包名称。


'apt list --manual-installed | grep -v cosmic'显示误报。这个答案好多了!
TamusJRoyce

1
@TamusJRoyce,是的,我想在编辑后也是如此。
杰诺

1

更多信息进行调查。

ubuntu支持状态 
回显“ $(sudo apt-mark showmanual | wc -l)标记为“手动安装”的软件包。”

...可能需要安装ubuntu-support-status和apt-mark。


无需使用sudoapt-mark showmanual
jarno

ubuntu-support-status列出了过时的软件包数量,但没有列出软件包名称。
杰诺

1
ubuntu-support-status --help
Hannu

哦,谢谢你的提示。
杰诺

0

可能有一种更清洁的方法,但是您可以做到的

dpkg -l | cut -f 3 -d ' ' > installed
xargs -n 1 --replace=X apt-cache search ^X$ < installed | cut -f 1 -d ' ' > available
diff installed available

清理文件的前几行installed:它将具有标题。

如果任何人都可以修复我的语法突出显示,则奖励...


2
如果要使用的输出dpkg -l获取已安装软件包的列表,则应将结果限制为第二列中带有“ i”的行,因为dpkg还会列出未安装的软件包(可能已删除但未清除) 。例如,将第一个命令更改为dpkg -l | grep '^.[^i]' | cut -f 3 -d ' ' 它将返回未安装的软件包列表。(但曾经是)
炖2012年

1
而且,apt-cache search someinstalledpackage即使该软件包无法从回购中获得,它也将返回某些内容,因此我认为这根本不起作用。
2012年

1
@stew我将留在这里看看是否有人得出结论,但是您的答案肯定要好得多。+1给你。
杰夫·费兰德

@stew dpkg -l | grep '^.[^i]' | cut -f 3 -d ' '还会打印一些标题行。
jarno

即使此答案有效,也将非常慢,因为它将apt-cache search分别针对每个软件包运行。
杰诺

0

如前所述,apt-get搜索不是检查软件包是否仍然可用的好方法。另外,我已将所有内容添加到仅一行中:

for i in `dpkg -l | grep '^i' | awk '{ print $2 }'`; do apt-cache show $i > /dev/null || echo $i; done

以及为什么grep '^i'
AB

@AB好点;并不能告诉您是否已安装该软件包,而是要安装该软件包所需的操作。请参阅man dpkg-query以获取更多信息。
jarno

这非常慢
jarno

apt-cache show这样做对检查包装是否可用没有好处。如果禁用了相应的存储库,但没有其他启用的存储库,则它仍显示软件包。
jarno
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.