尋找基於 Debian 的系統上所有已安裝軟體包的來源

尋找基於 Debian 的系統上所有已安裝軟體包的來源

我正在嘗試找到一種好方法來查找存儲在我的系統上的每個可以輕鬆解析的包的存儲庫。

背景故事:

我有 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以軟體包形式提供。當它運行時,它基本上會顯示所有不是當前安裝版本的軟體包。

https://packages.debian.org/stable/apt-forktracer

相關內容