Daftar (rekursif) dependensi dari paket yang diinstal di APT


17

Untuk setiap paket yang telah saya instal, saya ingin tahu paket mana yang akan diinstal jika saya uninstall. Contoh dari output yang saya butuhkan adalah ( package: list of deps):

abc: foo bar
bcd: baz abc
bdd: baz fuubar

Menambahkan

Jika saya memeriksa apa yang benar-benar akan dihapus jika saya menghapus paket pppmenggunakan apt-get:

$ echo $(apt-get --dry-run remove ppp | grep '^Remv ' | cut -d' ' -f2)
gnome-ppp mint-meta-xfce network-manager-pptp-gnome network-manager-pptp wvdial pppoeconf pppoe pptp-linux pppconfig ppp

Saya melihat bahwa ini berbeda dari apt-cachepertunjukan yang saya berikan (yang saya pikir tidak termasuk dependensi rekursif):

$ apt-cache show ppp | grep '^Breaks: '
Breaks: network-manager (<= 0.8.0.999-1), network-manager-pptp (<= 0.8.0.999-1), pppdcapiplugin (<= 1:3.9.20060704+dfsg.1-1)

Tambahkan 2

Apakah dpkg --get-selections | cut -f1cara yang dapat diandalkan untuk mendapatkan daftar paket yang diinstal untuk beralih?


1
Parsing apt-get --dry-run removepada dasarnya terlihat benar. Mungkin melewatkan beberapa paket yang diinstal secara otomatis yang hanya diperlukan untuk paket yang diinstal secara otomatis yang hanya dibutuhkan oleh paket yang Anda hapus. Apakah itu sebabnya Anda tidak menganggapnya sebagai jawaban yang cocok?
Gilles 'SANGAT berhenti menjadi jahat'

Jawaban:


11

Anda mengajukan beberapa pertanyaan berbeda di sini, saya harap setidaknya saya dapat membantu satu atau dua.

Untuk mendaftar semua paket yang diinstal, gunakan dpkguntuk menampilkan dalam daftar bidang yang dipisahkan

dpkg -l 

Untuk hanya mendapatkan daftar paket, tanpa bidang tambahan, sehingga Anda dapat mengirimnya ke tempat lain.

dpkg -l | awk '{print $2 }' # Pipe to grep after the awk, or glob from dpkg

Misalnya, jika saya ingin menghapus kernel lama,

apt-get purge `dpkg -l linux* | awk '{print $2}' | grep 3.0.0-12`

Cara termudah untuk melewati semua dependensi yang tidak dibutuhkan, adalah dengan debfoster. Ini berjalan secara interaktif dan melewati apa yang Anda inginkan, dependensi mereka dan dapat menghapus atau daftar apa yang bukan dependensi rekursif.

Untuk membuat daftar semua dependensi rekursif dari paket tertentu,

debfoster -d $PACKAGE ## PACKAGE is the specific package.

Setelah Anda mengeksekusi debfosterAnda dapat memeriksa tanggungan yang dimiliki paket,

debfoster -e $PACKAGE ## PACKAGE is the specific package.

Cara yang hebat untuk mendaftar paket 'yatim piatu' adalah dengan deborphan. Jalankan deborphantanpa opsi, dan itu akan mencantumkan semua paket 'yatim'. 'Yatim piatu' adalah paket yang tidak bergantung pada apa pun, dan Anda belum menginstalnya secara eksplisit.

Saya juga suka membersihkan paket 'yatim piatu', setelah instalasi baru. Setelah saya menghapus paket tertentu, Anda bisa mendapatkan apa pun yang terlewat apt-get autoremove --purgedengan,

apt-get purge `deborphan`

Akhirnya terkadang Anda tidak --purgedan berakhir dengan paket 'sisa', versi yang lebih baru apt-getdapat secara otomatis menghapusnya. Untuk menghapus semua 'sisa' dari paket yang dihapus, jalankan,

apt-get autoclean

Jika Anda tidak memiliki versi baru apt-get, Anda selalu dapat menghapusnya dengan perintah ini. Mereka membuat kesalahan jika tidak ada file 'sisa', sepertinya autoclean dapat melewatkan beberapa file sesekali.

dpkg --list |grep "^rc" | cut -d " " -f 3 | xargs dpkg --purge

debfoster masih ada, tetapi dianggap digantikan oleh fitur dalam bakat
Joshua Clayton

4
apt-cache show pkgname1 pkgname2...

akan (antara lain) mencantumkan dependensi (runtime) ini. Ini biasanya memadai, kecuali jika Anda memasukkannya ke mesin untuk diproses lebih lanjut. Jika Anda menginginkannya persis dengan format yang Anda sebutkan, Anda mungkin harus menulis skrip.


Maaf, saya salah merumuskan pertanyaan saya. Saya tertarik mengetahui paket mana yang akan dihapus untuk setiap paket yang telah saya instal. Dan saya juga perlu mendaftar semua paket yang telah saya instal.
Dihapus

2
@Deleted: Maaf, saya tidak melihat komentar ini sampai sekarang. Menanggapi "paket mana yang akan dihapus untuk setiap paket yang telah saya instal" (saya berasumsi Anda ingin pertanyaan ini dijawab berdasarkan per paket) cobalah apt-get remove -s packagename. Daftar semua paket yang telah Anda instal saja dpkg -l.
Faheem Mitha

@FaheemMitha: posting lama, tapi masih bagus apt-get remove -s packagename!
twan163

@ twan163 Senang itu berguna buat kamu.
Faheem Mitha

1

Saya pikir Anda harus melanjutkan dan membuat lingkaran untuk hal yang sama:

apt-cache depends libtext-wrapi18n-perl |xargs apt-cache depends

Tentu saja menghapus tajuk.


2
apt-cache depend memiliki opsi recuresapt-cache depends --recurse libtext
Joshua Clayton
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.