Ada banyak cara untuk menampilkan paket yang diinstal secara manual menggunakan apt
, seperti:
apt-mark showmanual
Tapi terkadang output itu terlalu banyak. Misalnya jika pengguna menginstal paket foo
. secara manual :
apt-get install foo
…dan foo
tergantung pada bar
dan baz
, lalu apt-mark showmanual
akan menghasilkan:
bar
baz
foo
Bagaimana kami dapat mencantumkan hanya paket tingkat atas yang diinstal secara manual (yaitu foo
) tanpa ketergantungannya (yaitu bukan baz
, atau bar
)?
Kode berikut tampaknya berfungsi, tetapi GNU parallel
memanggil apt-rdepends
beberapa ratus kali terlalu lambat, (tiga jam dengan CPU 4 inti):
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
Jawaban yang Diterima:
Ini dapat dilakukan dengan menggunakan Python apt API. Paket yang Anda lihat di apt-mark showmanual
persis yang ada di apt.cache.Cache()
yang is_installed
benar dan is_auto_installed
adalah palsu. Namun, lebih mudah untuk memproses dependensi:
#! /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))
Bahkan ini mencantumkan beberapa paket yang tidak akan saya lihat di sana (init
, grep
?!).