我正在尝试找到一种好方法来查找存储在我的系统上的每个可以轻松解析的包的存储库。
背景故事:
我有 Debian wheezy 系统并设置了 wheezy-backports 存储库,因此我可以获得更新版本的软件包。我在固定配置中的模式犯了一个错误,但我没有注意到。我固定了*
向后移植存储库。几周后,我发布了一个apt-get -y dist-upgrade
,但没有注意到,并将更多的软件包升级到了我感兴趣的喘息向后移植。
我有备份,所以我可以轻松地恢复内容,但这种情况让我真的想找到一种方法来查找每个包来自哪个存储库。
到目前为止我发现的最接近的方法是这样的。 apt-cache policy $(dpkg -l | awk '/ii/ {print $2}' )
。这有点接近,但理想情况下我希望获得所有包的这样的报告。
Package<tab>Version<tab>Origin<tab>Suite
其中 Origin/Suite 是存储库发布文件中的值。
答案1
以下 python 脚本解析输出apt-cache policy
并生成具有输出格式的所有已安装包的列表
Package<tab>Version<tab>Origin<tab>Suite
apt-show-origins apt-show-origins
#!/usr/bin/env python
# Should be written with python-apt
# but for now parse the output of apt-cache policy
import os
import re
command = "apt-cache policy $(dpkg -l | awk '/ii/ {print $2}' )"
stream = os.popen(command);
content = stream.readlines()
getOrigin = False
pkgList = []
#Parse the output generated by apt-cache
for s in content:
if(not s.startswith(' ')):
pkg = type('', (), {})() #Create an empty object
pkg.name = s[:-2] #Remove trailing ':\n'
elif(getOrigin):
pkg.origin = re.split('\s+',s)[2]
pkg.suite = re.split('\s+',s)[3]
pkgList.append(pkg)
getOrigin = False
elif(s.startswith(' ***')):
pkg.version = re.split('\s+',s)[2]
getOrigin = True
#Display the list
for pkg in pkgList:
print pkg.name + '\t'\
+ pkg.version + '\t'\
+ pkg.origin + '\t'\
+ pkg.suite
笔记:
- 相反,评论中所说的
apt-show-versions
仍然保留,请检查官方邮件列表。但它无济于事,因为它不输出包的来源。
答案2
自从我发布这个问题以来已经有一段时间了。不管怎样,几年前添加了一个工具,它也可以解决我的底层问题,即查找系统上安装的额外/过时/外国软件包。
该命令apt-forktracer
以软件包形式提供。当它运行时,它基本上会显示所有不是当前安装版本的软件包。