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 ?!).