Ada banyak cara untuk menunjukkan paket yang diinstal menggunakan secara manual apt
, seperti:
apt-mark showmanual
Tetapi terkadang output itu terlalu banyak. Misalnya jika pengguna menginstal paket secara manual foo
:
apt-get install foo
... dan foo
bergantung pada bar
dan baz
, kemudian apt-mark showmanual
akan menampilkan:
bar
baz
foo
Bagaimana kita bisa mendaftar hanya paket tingkat atas yang diinstal secara manual ( yaitu foo
) tanpa ketergantungannya ( mis. Tidak baz
, juga bar
)?
Kode berikut tampaknya berfungsi, tetapi panggilan GNU beberapa ratus kali terlalu lambat, (tiga jam dengan CPU 4 inti):parallel
apt-rdepends
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:
Ini bisa dilakukan dengan menggunakan API Python apt. Paket yang Anda lihat
apt-mark showmanual
adalah paketapt.cache.Cache()
yangis_installed
benar danis_auto_installed
salah. Tapi, lebih mudah untuk memproses dependensi:Bahkan ini mencantumkan beberapa paket yang tidak akan saya lihat di sana (
init
,grep
?!).sumber
init
dangrep
, (mungkin data apt Anda rusak?), Juga menunjukkan terlalu banyak perpustakaan. OTOH, kode 3 jam saya kehilangan beberapa item yang seharusnya ada, item yangpython
dicetak oleh kode di atas . Mungkin barang yang hilang tidak terpasangapt
.python
Kode di atas adalah 3600 kali lebih cepat (yaitu butuh 3 detik) daripada kode saya (3 jam). Menantikan pengujian versi rekursif ...Script shell berikut mencari orang tua dari semua dependensi yang diinstal.
Saya menggunakan
tsort
skrip ini. Saya berasumsi bahwa ketika menambahkan marker di akhir tanpa dependensi marker juga akan menjadi entri terakhir tanpa dependensi pada hasil saya. Jadi saya dapat membedakan antara paket terakhir tanpa dependensi dan paket pertama dengan dependensi.Saya perhatikan satu masalah dengan solusi ini:
Ada siklus dalam grafik ketergantungan. Entri-entri itu diabaikan oleh
tsort
.sumber
Anda dapat menemukan semua paket yang diinstal secara manual tanpa tingkat ketergantungan pertama sebagai berikut:
Anda juga dapat menggunakan sihir satu garis berikut:
sumber
dasher
paket. Pada sistem saya, kode OP disalurkan melaluisort -V
output 475 baris, kode muru menghasilkan 914 baris, (termasukdasher
), dan kode jawaban ini menghasilkan 995 baris.