apt
を使用して手動でインストールされたパッケージを表示する方法はたくさんあります 、例:
apt-mark showmanual
しかし、時にはその出力が多すぎます。たとえば、ユーザーがパッケージfoo
を手動でインストールした場合 :
apt-get install foo
…そしてfoo
bar
に依存 およびbaz
、次にapt-mark showmanual
出力されます:
bar
baz
foo
手動でインストールされた最上位のパッケージ(つまり)のみを一覧表示するにはどうすればよいですか。 foo
)依存関係なし(つまり baz
ではありません 、またはbar
)?
次のコードは機能しているようですが、 GNU 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
承認された回答:
これは、PythonaptAPIを使用して実行できます。 apt-mark showmanual
に表示されるパッケージ まさにapt.cache.Cache()
にあるものです is_installed
の対象 trueであり、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
?!)。