問題の説明

問題の説明

問題の説明

aptとaptitudeの両方がどのパッケージがインストールされているかを覚えています。自動的に他のパッケージの依存関係として、または手動いくつかの理由。さまざまな理由でリストに手動バッグは不必要に大きくなる可能性があり、時間の経過とともに合計が始まります。これらのパッケージは、特に要求された場合にのみ削除されます。

一般的な例としては、何らかの理由でパッチとしてインストールできますが、後でそれに依存するソフトウェアの一部がインストールされている場合は、サイレントインストールとして表示されるライブラリパッケージがあります。ただし、これが発生しない場合は、そのパッケージに依存するパッケージが削除されてもインストールされたままになります。場合によっては、同様のツールを使用して残りのdeborphanパッケージを見つけることができますが、多くの推測を実行する必要があり、体系的なソリューションではありません。

考えられる解決策の説明

だから私は、パッケージを削除せずにサイレントインストールとしてマークできるパッケージを見つける方法を探しています。これは、現在手動​​でインストールされているとマークされていますが、インストールされている他のパッケージの依存関係(または推奨される依存関係)であるパッケージを見つけることを意味します。その後、これらのパッケージは次のように表示できます。自動的にもう必要ない場合は、別のソフトウェアをインストールしてアンインストールします。

似たようなツールを作れると思いました。libapt用のPythonバインディングしかし、似たようなものがすでに存在する場合は、車輪を再発明したくありません。

ベストアンサー1

手動でインストールされたパッケージと、インストールされたパッケージの必須または推奨の依存関係であるパッケージを検索します。資格があれば可能です。

aptitude search -q -F %p '?installed !?automatic (?reverse-depends(?installed .*) | ?reverse-recommends(?installed .*))'

各パッケージにどの依存関係があるかを示す方法はないと思います。この情報が必要な場合は、Pythonが最善の選択です。この非常に速くて汚いスクリプトはトリックを実行しているようです(ほとんどの分離、バージョンの依存関係、辞書の依存関係などに関連するいくつかの非直接的なケースでは正しくないと思います)。

#!/usr/bin/env python2
import apt

packages = apt.Cache()
covered = {}
# Inverse dependency computation: for each installed package, record which
# packages require it (as Depends: or Recommends:).
for p in packages:
    if p.installed:
        for l in p.installed.dependencies + p.installed.recommends:
            for d in l:
                if packages.has_key(d.name) and packages[d.name].installed:
                    if not covered.has_key(d.name):
                        covered[d.name] = []
                    covered[d.name] += [p.name]
# Print out the manually installed packages that are required by another
# installed package, as well as the requiring package(s).
for p in sorted(covered.keys()):
    if not packages[p].is_auto_installed:
        print(' '.join([p] + covered[p]))

おすすめ記事