依存関係を除く手動でインストールされた最上位パッケージのリスト

依存関係を除く手動でインストールされた最上位パッケージのリスト

手動でインストールされたパッケージを表示する方法はいくつかありますapt。たとえば、次のようになります。

apt-mark showmanual

しかし、時にはこの出力が多すぎる場合があります。たとえば、ユーザーがパッケージを手動でインストールする場合foo:

apt-get install foo

...その後、次のようにfoo出力されます。barbazapt-mark showmanual

bar
baz
foo

手動でインストールされた親パッケージのみを一覧表示するにはどうすればよいですか(つまり foo)には依存関係がありません(つまりいいえbazいいえbar)?


以下のコードはうまくいくようですが、牛に似た一種の栄養 parallel何百回も呼び出すのはapt-rdepends遅すぎます(4コアCPUで3時間)。

apt-mark showmanual | 
tee /tmp/foo | 
parallel "apt-rdepends -f Depends,PreDepends,Suggests,Recommends {} |
          tail +2" 2> /dev/null | 
tr -s ' ' '\n' | 
grep -v '[():]' | 
sort -Vu | 
grep -wv -f - /tmp/foo

ベストアンサー1

これはPython apt APIを使用して行うことができます。あなたが見るパッケージはそこにある実際のパッケージでありapt-mark showmanualapt.cache.Cache()is_installedis_auto_installed偽です。しかし、依存関係を処理する方が簡単です。

#! /usr/bin/env python3

from apt import cache

manual = set(pkg for pkg in cache.Cache() if pkg.is_installed and not pkg.is_auto_installed)
depends = set(dep_pkg.name for pkg in manual for dep in pkg.installed.get_dependencies('PreDepends', 'Depends', 'Recommends') for dep_pkg in dep)

print('\n'.join(pkg.name for pkg in manual if pkg.name not in depends))

ここには、私が見ることができないと予想されるいくつかのパッケージがリストされています(initgrep?!)。

おすすめ記事