Bagaimana cara mengecualikan paket dari apt-get autoremove?

20

Saya berada dalam situasi di mana daftar paket yatim yang akan dihapus dengan apt-get autoremovemenyertakan paket yang ingin saya simpan. Rupanya saya tidak sengaja menghapus paket yang tergantung padanya. Bagaimana saya sekarang dapat menandai paket sebagai yang diinginkan secara eksplisit, sehingga apt-get autoremovetidak akan menghapusnya?

bluenote10
sumber

Jawaban:

29

Menggunakan apt-mark

$ man apt-mark
...
manual
       manual is used to mark a package as being manually installed, which will 
prevent the package from being automatically removed if no other packages 
depend on it.

Begitu

sudo apt-mark manual <package-name>

Sekarang autoremovetidak akan menghapusnya.

Untuk membatalkan

sudo apt-mark auto <package-name>

Sekarang autoremoveakan menghapus paket jika bukan ketergantungan dari paket lain.

Zanna
sumber
Trik praktis lainnya adalah Anda dapat menandai banyak paket sekaligus seperti ini: sudo apt-mark manual <package1> <package2> <package3> dll
Msencenb
10

Beberapa upaya Google lagi memunculkan solusi :

Mungkin saja untuk menginstal secara eksplisit:

sudo apt-get install <package>

atau menandai sebagai diinstal secara manual melalui

sudo apt-mark manual <package>

apt tidak akan menginstal ulang, hasilnya hanya akan terlihat seperti:

$ sudo apt-get install tmux
Reading package lists... Done
Building dependency tree       
Reading state information... Done
tmux is already the newest version.
tmux set to manually installed.
bluenote10
sumber
0

Ini sudah dijawab dengan baik, tetapi saya menemukan situasi di mana saya tidak ingin "menandai" banyak paket (dan kemudian menghapusnya setelahnya autoremove).

Ketika daftar paket yang ingin Anda autoremove mudah ditentukan, maka Anda dapat mem-pipe / sed/ xargskeluar.

Saya tidak memiliki contoh kompleks dari banyak paket, tetapi jika saya memiliki skenario berikut:

root@fptc-rsvrd:~# apt-get autoremove
Reading package lists... Done
Building dependency tree
Reading state information... Done
The following packages will be REMOVED:
  libluajit-5.1-2 libluajit-5.1-common linux-headers-4.4.0-141 linux-headers-4.4.0-141-generic linux-headers-4.4.0-143 linux-headers-4.4.0-143-generic linux-headers-4.4.0-146 linux-headers-4.4.0-146-generic
  linux-image-4.4.0-141-generic linux-image-4.4.0-143-generic linux-image-4.4.0-146-generic linux-image-extra-4.4.0-141-generic linux-modules-4.4.0-143-generic linux-modules-4.4.0-146-generic
  linux-modules-extra-4.4.0-143-generic linux-modules-extra-4.4.0-146-generic linux-signed-image-4.4.0-141-generic pandoc-data
0 upgraded, 0 newly installed, 18 to remove and 19 not upgraded.
After this operation, 907 MB disk space will be freed.

dan saya hanya ingin menghapus linux*paket, saya bisa melakukan ini:

root@fptc-rsvrd:~# apt-get autoremove -s | sed -ne 's/Remv \(linux[^[]*\)\[.*/\1/gp'
linux-headers-4.4.0-141-generic
linux-headers-4.4.0-141
linux-headers-4.4.0-143-generic
linux-headers-4.4.0-143
linux-headers-4.4.0-146-generic
linux-headers-4.4.0-146
linux-signed-image-4.4.0-141-generic
linux-image-extra-4.4.0-141-generic
linux-image-4.4.0-141-generic
linux-modules-extra-4.4.0-143-generic
linux-image-4.4.0-143-generic
linux-modules-extra-4.4.0-146-generic
linux-image-4.4.0-146-generic
linux-modules-4.4.0-143-generic
linux-modules-4.4.0-146-generic

Jadi dari sini, mudah untuk mengirimkannya melalui xargsargumen command-line ke sederhana apt-get remove -y:

apt-get autoremove -s \
  | sed -ne 's/Remv \(linux[^[]*\)\[.*/\1/gp' \
  | xargs apt-get remove -y

Biasanya ketika menggunakan xargs, saya akan menjaga spasi di argumen (misalnya, find ... -print0 | xargs -0 ...), tetapi karena nama paket tidak memiliki spasi di dalamnya, saya merasa nyaman menggunakan argumen yang dibatasi baris baru.

(Saya akan berpikir itu situasi lain, akan lebih tepat untuk "menandai" penangguhan, membuka kemasannya. Itu juga dapat dilakukan dengan regex dan xargs, tetapi mungkin terlalu merekayasa situasinya.)

r2evans
sumber