私は簡単に解析できる私のシステムに保存されているすべてのパッケージのリポジトリを見つける良い方法を見つけようとしています。
背景ストーリー:
私はDebian wheezyシステムを持っていて、最新バージョンのパッケージを入手できるようにwheezy-backportsリポジトリを設定しました。固定構成でモードを間違って書いたのに気づかなかった。バックポートリポジトリを修正しました*
。数週間後、私はapt-get -y dist-upgrade
気づかずに1つをリリースし、興味があったwheezeバックポートにさらにパッケージをアップグレードしました。
コンテンツを簡単に復元できるようにバックアップがありますが、この状況では、各パッケージがどのリポジトリから来たのかを調べる方法を探しています。
これまで私が見つけた最も近い方法はこれです。 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 - ショー - 起源
#!/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
ソフトウェアパッケージで提供されます。実行すると、デフォルトで現在インストールされているバージョン以外のすべてのパッケージが表示されます。