手動でインストールされたパッケージを表示する方法はいくつかありますapt
。たとえば、次のようになります。
apt-mark showmanual
しかし、時にはこの出力が多すぎる場合があります。たとえば、ユーザーがパッケージを手動でインストールする場合foo
:
apt-get install foo
...その後、次のようにfoo
出力されます。bar
baz
apt-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 showmanual
、apt.cache.Cache()
is_installed
is_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))
ここには、私が見ることができないと予想されるいくつかのパッケージがリストされています(init
、grep
?!)。