มาแบ่งรหัสทีละหนึ่ง (สำหรับระบบของฉัน):
$ dpkg -l 'linux-image-*'
Desired=Unknown/Install/Remove/Purge/Hold
| Status=Not/Inst/Conf-files/Unpacked/halF-conf/Half-inst/trig-aWait/Trig-pend
|/ Err?=(none)/Reinst-required (Status,Err: uppercase=bad)
||/ Name Version Architecture Description
+++-=============================-===================-===================-================================================================
un linux-image-3.0 <none> <none> (no description available)
ii linux-image-3.13.0-32-generic 3.13.0-32.57 amd64 Linux kernel image for version 3.13.0 on 64 bit x86 SMP
ii linux-image-extra-3.13.0-32-g 3.13.0-32.57 amd64 Linux kernel extra modules for version 3.13.0 on 64 bit x86 SMP
ii linux-image-generic 3.13.0.32.38 amd64 Generic Linux kernel image
$ dpkg -l 'linux-image-*' | sed '/^ii/!d'
ii linux-image-3.13.0-32-generic 3.13.0-32.57 amd64 Linux kernel image for version 3.13.0 on 64 bit x86 SMP
ii linux-image-extra-3.13.0-32-generic 3.13.0-32.57 amd64 Linux kernel extra modules for version 3.13.0 on 64 bit x86 SMP
ii linux-image-generic 3.13.0.32.38 amd64 Generic Linux kernel image
$ uname -r | sed 's/\(.*\)-\([^0-9]\+\)/\1/'
3.13.0-32
$ dpkg -l 'linux-image-*' | sed '/^ii/!d' | sed "/$(uname -r | sed 's/\(.*\)-\([^0-9]\+\)/\1/')/d"
ii linux-image-generic 3.13.0.32.38 amd64 Generic Linux kernel image
$ dpkg -l 'linux-image-*' | sed '/^ii/!d' | sed "/$(uname -r | sed 's/\(.*\)-\([^0-9]\+\)/\1/')/d" | sed 's/^[^ ]* [^ ]* \([^ ]*\).*/\1/'
linux-image-generic
$ dpkg -l 'linux-image-*' | sed '/^ii/!d' | sed "/$(uname -r | sed 's/\(.*\)-\([^0-9]\+\)/\1/')/d" | sed 's/^[^ ]* [^ ]* \([^ ]*\).*/\1/' | sed '/[0-9]/!d'
## No output
ดังนั้นจะไม่ทำอะไร:
$ sudo apt-get remove --purge $(dpkg -l 'linux-image-*' | sed '/^ii/!d;/'"$(uname -r | sed "s/\(.*\)-\([^0-9]\+\)/\1/")"'/d;s/^[^ ]* [^ ]* \([^ ]*\).*/\1/;/[0-9]/!d')
อย่างที่คุณเห็นมันใกล้เคียงกับการลบแพ็คเกจเมตาแกรมปัจจุบันของฉัน linux-image-generic 3.13.0.32.38 amd64 Generic Linux kernel image
(ขอบคุณsed '/[0-9]/!d'
บรรทัดสุดท้ายนี้) ซึ่งผิด
โดยสังเขปชิ้นนี้sed
มีหลายประเด็น คุณควรหลีกเลี่ยงที่จะลบเมล็ดเก่าออก
แก้ไข:
ฉันได้กล่าวไปแล้วว่าsed
คำสั่งมีปัญหา เพื่อประโยชน์ในการขยายฉันจะลบสองบรรทัดสุดท้ายด้วยแบบฟอร์มที่จริงควรทำงานในสถานการณ์ปัจจุบันของฉัน
สองบรรทัดสุดท้ายในรูปแบบที่แก้ไข:
sed -r 's/^[^ ]* *(([a-z]|-)*)(-[a-z]*) *(([0-9]|-)*)\..*/\1-\4\3/'
ดังนั้น:
$ dpkg -l 'linux-image-*' | sed '/^ii/!d;/'"$(uname -r |
sed "s/\(.*\)-\([^0-9]\+\)/\1/")"'/d' |
sed -r 's/^[^ ]* *(([a-z]|-)*(-[a-z]*) *(([0-9]|\.|-)*)\..*/\1\-\4\3/'
Outpus:
linux-image-3.13.0.32-generic
นั่นมันช่างเลวร้ายมาก !!
ตอนนี้แสดงสิ่งนี้จะทำอะไรกับระบบของฉัน--dry-run
ning apt-get remove
คำสั่งเต็ม:
$ sudo apt-get remove --dry-run $(dpkg -l 'linux-image-*' |
sed '/^ii/!d;/'"$(uname -r | sed "s/\(.*\)-\([^0-9]\+\)/\1/")"'/d' |
sed -r 's/^[^ ]* *(([a-z]|-)*)(-[a-z]*) *(([0-9]|\.|-)*)\..*/\1\-\4\3/')
Reading package lists... Done
Building dependency tree
Reading state information... Done
Note, selecting 'linux-image-3.13.0-32-generic' for regex 'linux-image-3.13.0.32-generic'
The following package was automatically installed and is no longer required:
linux-headers-generic
Use 'apt-get autoremove' to remove it.
The following packages will be REMOVED:
linux-generic linux-image-3.13.0-32-generic
linux-image-extra-3.13.0-32-generic linux-image-generic
0 upgraded, 0 newly installed, 4 to remove and 0 not upgraded.
Remv linux-generic [3.13.0.32.38]
Remv linux-image-generic [3.13.0.32.38]
Remv linux-image-extra-3.13.0-32-generic [3.13.0-32.57]
Remv linux-image-3.13.0-32-generic [3.13.0-32.57]
อย่างที่คุณเห็นมันจะลบเมล็ดปัจจุบันทั้งหมดของฉันด้วยโปรดทราบว่านี่เป็นเพียงการจำลองสถานการณ์เพื่อให้ตรงกับสถานการณ์ปัจจุบันของฉันและsed
สามารถปรับปรุงต้นฉบับได้
** หมายเหตุว่ารหัสที่เกิดขึ้นจริงจะทำงานถ้าทำreboot
หลังจากการปรับรุ่นเคอร์เนลเป็นOli กล่าวแล้ว
EDIT2:
นี่เป็นสคริปต์ที่เรียบง่าย แต่มีประสิทธิภาพที่จะพิจารณาทุกสถานการณ์และลบเมล็ดเก่าที่แท้จริง:
#!/bin/bash
kernels=( $(grep -Po "^linux-image-[^-]+-[^-]+-generic\b" < <(dpkg --get-selections)) )
cur_rel=$(grep -Po ".*(?=-[a-z]*$)" < <(uname -r))
for kernel in "${kernels[@]}"; do
ker_rel=$(grep -Po "[0-9].*(?=-[a-z]*)" <<< "$kernel")
dpkg --compare-versions "$ker_rel" gt "$cur_rel" && { echo "Please Restart your computer first"; break; }
dpkg --compare-versions "$ker_rel" lt "$cur_rel" && sudo apt-get remove "$kernel"
done
หากคุณมีเวอร์ชันใด ๆ ที่ใหม่กว่าเวอร์ชั่นปัจจุบันจะมีคำเตือนให้คุณรีสตาร์ทคอมพิวเตอร์ก่อน นอกจากนี้โปรดทราบว่าเคอร์เนลที่เก่ากว่านั้นได้รับการเก็บรักษาไว้เนื่องจากเหตุผลที่ดีซึ่งหากคุณทำให้ระบบเคอร์เนลปัจจุบันของคุณทำให้ระบบของคุณไม่เสถียรคุณควรจะสามารถบูตเข้าสู่เคอร์เนลที่เก่ากว่า