![查找当前安装的软件包的最小等效版本](https://linux22.com/image/957174/%E6%9F%A5%E6%89%BE%E5%BD%93%E5%89%8D%E5%AE%89%E8%A3%85%E7%9A%84%E8%BD%AF%E4%BB%B6%E5%8C%85%E7%9A%84%E6%9C%80%E5%B0%8F%E7%AD%89%E6%95%88%E7%89%88%E6%9C%AC.png)
我使用了一个工具来计算您可以安装的最小软件包集,以获取您当前拥有的软件包集。这与告诉您您的选择不同。它实际上是找到最短的软件包列表,这些软件包将通过依赖关系为您提供您当前拥有的内容。
我忘了在哪里可以找到这个工具。它叫什么名字?
答案1
aptitude
可以通过其搜索功能帮助您完成大部分工作。下面介绍如何查找已安装的所有内容(不仅仅是自动依赖项):
aptitude search -F "%p" "?installed ?not(?automatic)"
这不是最佳选择,其中一些可能能够被移除,但我不知道解决这个问题的简单方法。也许答案就在man aptitude
。
再想想,有了那个列表,你可以循环遍历它并找到每个包的依赖包(不是依赖项)。如果其中一个在主列表中,则从列表中删除当前包……但只有在解析了整个列表之后才能这样做,否则你会错过 3+ 级依赖树中的中间包。
您可以使用如下查询来查找家属:
aptitude search '~i~Dpackage'
我会试着写剧本,但我只能用很小的手机键盘打字。即便是我,也有局限性。
编辑:试着睡了五分钟后,我开始解决这个问题。像这样的事情应该可以完成工作:
orig=$(aptitude search -F "%p" "?installed ?not(?automatic)")
newlist="";
for p in $orig; do
depended=0;
for dependant in `aptitude search -F "%p" "~i~D$p"`; do
if [[ $orig == "* $dependant *" ]]; then
depended=1;
fi;
done;
if [[ $depended == 0 ]]; then
newlist="$newlist $p";
fi;
done;
echo $newlist
注意这需要真的运行时间很长,而且可能会过于热衷(例如,如果它们依赖于您之后安装的 $orig 列表中的其他内容,它将删除您手动安装的内容,您想要手动安装的内容)。
答案2
我编写了一个小的 Python 脚本来实现这一点,发布为要点在这里。
您在命令行上为其提供一组软件包名称,它应该为您提供一组更小、最小的软件包,这些软件包暗示了您作为参数给出的所有其他软件包。这里,x11-proto-fixes-dev
暗示了(依赖性)libgtk2.0-dev
:
fuwaad:~$ python mindeps.py x11proto-fixes-dev libgtk2.0-dev
libgtk2.0-dev
答案3
我在已经运行多年的系统上尝试了这个问题和另外两个类似问题的答案,我能得到的最短列表是 1338 个包,其中大多数显然是依赖项或库存包。
然而,在 Unix/Linux Stack Exchange 上我发现这个答案,它会从 Ubuntu 镜像中提取要安装的库存软件包列表并将其过滤掉。这样我的列表就缩减到 404 个软件包,对我来说这些软件包看起来是合理的。