วิธีการแยกแพคเกจจาก apt-get autoremove ได้อย่างไร


20

ฉันอยู่ในสถานการณ์ที่จะลบรายการแพ็กเกจที่ถูกกำพร้าออกโดยapt-get autoremoveใส่แพ็คเกจที่ฉันต้องการเก็บไว้ด้วย เห็นได้ชัดว่าฉันลบแพคเกจโดยไม่ตั้งใจซึ่งขึ้นอยู่กับมัน ตอนนี้ฉันจะทำเครื่องหมายแพคเกจตามที่ต้องการอย่างชัดเจนเพื่อที่apt-get autoremoveจะไม่ลบมันได้อย่างไร


และคำถามที่เกี่ยวข้อง: ทำไมมันถึงเป็นกำพร้าเลย?
bluenote10

คำตอบ:


29

ใช้ 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.

ดังนั้น

sudo apt-mark manual <package-name>

ตอนนี้autoremoveจะไม่ลบมัน

เพื่อยกเลิก

sudo apt-mark auto <package-name>

ตอนนี้autoremoveจะลบแพ็กเกจหากไม่ใช่การขึ้นต่อกันของแพ็กเกจอื่น


เคล็ดลับที่มีประโยชน์อีกอย่างคือคุณสามารถทำเครื่องหมายแพ็คเกจจำนวนมากในครั้งเดียวเช่นนี้: คู่มือ sudo apt-mark <package1> <package2> <package3> ฯลฯ
Msencenb

10

Google พยายามเพิ่มอีกไม่กี่ครั้ง แก้ปัญหา :

เป็นไปได้ที่จะติดตั้งอย่างชัดเจน:

sudo apt-get install <package>

หรือทำเครื่องหมายว่าติดตั้งด้วยตนเองผ่าน

sudo apt-mark manual <package>

apt จะไม่ติดตั้งใหม่ผลลัพธ์ก็จะดูเหมือน:

$ 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.

0

นี่เป็นคำตอบที่ดี แต่ฉันพบสถานการณ์ที่ฉันไม่ต้องการ "ทำเครื่องหมาย" แพ็คเกจจำนวนมาก (แล้วยกเลิกการทำเครื่องหมายหลังจากautoremove)

เมื่อรายการแพคเกจที่คุณต้องการ autoremove ถูกกำหนดอย่างง่ายดายคุณสามารถไปที่ /sed / xargsออกได้

ฉันไม่มีตัวอย่างที่ซับซ้อนของแพ็คเกจจำนวนมาก แต่ถ้าฉันมีสถานการณ์ต่อไปนี้:

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.

และฉันต้องการที่จะลบเฉพาะlinux*แพ็คเกจฉันสามารถทำได้:

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

ดังนั้นจากที่นี่มันง่ายที่จะผ่านสิ่งเหล่านี้ผ่านxargsเป็นอาร์กิวเมนต์บรรทัดคำสั่งไปที่ง่าย ๆapt-get remove -y:

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

ปกติเมื่อใช้งาน xargsฉันจะป้องกันช่องว่างในอาร์กิวเมนต์ (เช่นfind ... -print0 | xargs -0 ... ) แต่เนื่องจากชื่อแพ็คเกจไม่มีช่องว่างฉันจึงใช้อาร์กิวเมนต์ที่คั่นด้วย newline

(ฉันคิดว่ามันเป็นสถานการณ์อื่นมันควรจะเหมาะสมกว่าที่จะ "ทำเครื่องหมาย" การถือครองการแบ่งบรรจุภัณฑ์ซึ่งสามารถทำได้ด้วย regexes และxargsแต่น่าจะเป็นเรื่องของวิศวกรรมมากไป)

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.