如何高效获取已安装的非LTS软件包列表?

我想通过支持5年的软件包来了解我的系统在多大程度上得到LTS支持,以及哪些软件包不受支持。我可以忽略一些不支持5年的软件包,因为有些很少使用或者很不可能出现(安全)问题。
我认为这很有用,因为人们可以得到一份报告并得出结论,例如:“我的系统是100%的LTS”,“由于X、Y、Z软件包,我的系统只有99%的LTS”,“由于使用了KDE,我的系统现在只有50%的LTS”。
与我在问题“12.04 LXDE是否具有LTS?”中的回答相关,我发布了一种查看Ubuntu哪些软件包拥有五年支持的方法。例如:
$ apt-cache show unity | grep ^Supported
Supported: 5y

$ apt-cache show lxde-core | grep ^Supported
<no output>

我可以编写一个脚本来获取所有软件包的信息,但是apt-cache命令非常慢。
real    0m1.535s
user    0m1.484s
sys     0m0.036s

有2700多个已安装的软件包,大约需要70分钟(!)。
我该如何加快速度并为系统上所有不再受支持五年的软件包生成报告?
我希望使用一个简单的apt-* shell命令来在简单的shell脚本中使用。如果需要更高级的脚本编程(比如使用Python),也可以。最终,我想发布一个(小型)脚本,以便轻松快速地创建一个系统报告。
注:我对于特定版本的Ubuntu是否提供LTS没有兴趣 - 这只是关于软件包。你可以在系统上混合使用LTS和非LTS软件包。
2个回答

我不了解你的系统,但这是我所做的:
time dpkg -l | grep 'ii' |  awk ' {print $2}' | xargs apt-cache show | grep '^Supported:' | grep -v '5y' | wc -l
158

real        0m27.549s
user        0m5.580s
sys         0m21.701s

看起来还不错,对吧?

包裹的总数量:

dpkg -l | grep 'ii' | wc -l
2602

我正在使用一台AMD E-350的电脑,它并不是一个速度飞快的处理器...
编辑:xargs的最大参数数量:
xargs --show-limits

...
POSIX upper limit on argument length (this system): 2091826
...

我不这么认为,请看我的修改。 - Gerhard Burger
使用xargs将软件包作为参数传递给apt-cache在这里起到了关键作用。谢谢!为了确保不会超过xargs的参数限制,我会在我的脚本中使用Bash参数限制检查。 - gertvdijk
该命令在Xubuntu 13.04上排除了XFCE软件包,并且通常会排除没有Supported:字段的软件包。对我来说不起作用。 - ignis
这个答案的目的是展示使用xargs使得原问题中给出的解决方案变得更快。如果你想列出单独的软件包,你需要一个更复杂的脚本。 - Gerhard Burger
@ignis 你可以使用类似这样的命令(虽然不太美观,但应该能完成任务):dpkg -l | grep 'ii' | awk ' {print $2}' | xargs apt-cache show | grep 'Package:\|Supported:' | awk 'BEGIN{lts=false;p="Non-LTS packages:"} {if ($1 == "Package:"){ if (lts == false){print p}; p=$2 } else if ($0 == "Supported: 5y"){lts=true}} END {if (lts == false) print p}' - Gerhard Burger

这是一个快速的一行命令,可以使用grep-dctrl(1)来获取维护时间少于完整LTS期限5年的软件包列表。
sudo apt-get install dctrl-tools
dpkg -l | grep '^ii' |  awk ' {print $2}' | xargs apt-cache show | grep-dctrl -v -FSupported --exact-match -nsPackage 5y | sort | uniq

你可以轻松地修改它以寻找不同的支持期。