dpkg -l linux-{image,headers}-* | awk '/^ii/{print $2}'
เช่นเดียวกับ Malte ที่แนะนำ แสดงรายการเคอร์เนลไฟล์ที่เกี่ยวข้อง
egrep '[0-9]+\.[0-9]+\.[0-9]+'
Malte ยังแนะนำให้เป็นวิธีที่ปลอดภัยกว่าในการเลือกเฉพาะเคอร์เนลไฟล์โดยค้นหาหมายเลขเวอร์ชัน
เนื่องจากตอนนี้เราอาจจะมีรายชื่อทั้งรูปภาพและแพ็คเกจส่วนหัวการตั้งชื่อแพ็คเกจอาจแตกต่างกันดังนั้นเราจึงมีวิธีแก้ปัญหา awk นี้ซึ่งจำเป็นสำหรับการจัดเรียงawk 'BEGIN{FS="-"}; {if ($3 ~ /[0-9]+/) print $3"-"$4,$0; else if ($4 ~ /[0-9]+/) print $4"-"$5,$0}'
ผลที่ได้คือคอลัมน์ใหม่พร้อมหมายเลขเวอร์ชันก่อนชื่อแพคเกจดั้งเดิมดังนี้
$ dpkg -l linux-{image,headers}-* | awk '/^ii/{print $2}' | egrep '[0-9]+\.[0-9]+\.[0-9]+' | awk 'BEGIN{FS="-"}; {if ($3 ~ /[0-9]+/) print $3"-"$4,$0; else if ($4 ~ /[0-9]+/) print $4"-"$5,$0}'
3.11.0-23 linux-headers-3.11.0-23
3.11.0-23 linux-headers-3.11.0-23-generic
3.11.0-24 linux-headers-3.11.0-24
3.11.0-24 linux-headers-3.11.0-24-generic
3.11.0-26 linux-headers-3.11.0-26
3.11.0-26 linux-headers-3.11.0-26-generic
3.11.0-23 linux-image-3.11.0-23-generic
3.11.0-24 linux-image-3.11.0-24-generic
3.11.0-26 linux-image-3.11.0-26-generic
3.8.0-35 linux-image-3.8.0-35-generic
3.11.0-23 linux-image-extra-3.11.0-23-generic
3.11.0-24 linux-image-extra-3.11.0-24-generic
3.11.0-26 linux-image-extra-3.11.0-26-generic
3.8.0-35 linux-image-extra-3.8.0-35-generic
ตอนนี้เราต้องเรียงลำดับรายการเพื่อป้องกันการถอนการติดตั้งอิมเมจที่ใหม่กว่าที่เป็นอยู่ในปัจจุบัน sort -k1,1 --version-sort -r
ให้สิ่งนี้กับเรา:
$ dpkg -l linux-{image,headers}-* | awk '/^ii/{print $2}' | egrep '[0-9]+\.[0-9]+\.[0-9]+' | awk 'BEGIN{FS="-"}; {if ($3 ~ /[0-9]+/) print $3"-"$4,$0; else if ($4 ~ /[0-9]+/) print $4"-"$5,$0}' | sort -k1,1 --version-sort -r
3.11.0-26 linux-image-extra-3.11.0-26-generic
3.11.0-26 linux-image-3.11.0-26-generic
3.11.0-26 linux-headers-3.11.0-26-generic
3.11.0-26 linux-headers-3.11.0-26
3.11.0-24 linux-image-extra-3.11.0-24-generic
3.11.0-24 linux-image-3.11.0-24-generic
3.11.0-24 linux-headers-3.11.0-24-generic
3.11.0-24 linux-headers-3.11.0-24
3.11.0-23 linux-image-extra-3.11.0-23-generic
3.11.0-23 linux-image-3.11.0-23-generic
3.11.0-23 linux-headers-3.11.0-23-generic
3.11.0-23 linux-headers-3.11.0-23
3.8.0-35 linux-image-extra-3.8.0-35-generic
3.8.0-35 linux-image-3.8.0-35-generic
ตอนนี้ตัดออกไฟล์เคอร์เนลปัจจุบันและใหม่กว่าsed -e "1,/$(uname -r | cut -f1,2 -d"-")/d" | grep -v -e `uname -r | cut -f1,2 -d"-"`
ให้เรานี้:
$ dpkg -l linux-{image,headers}-* | awk '/^ii/{print $2}' | egrep '[0-9]+\.[0-9]+\.[0-9]+' | awk 'BEGIN{FS="-"}; {if ($3 ~ /[0-9]+/) print $3"-"$4,$0; else if ($4 ~ /[0-9]+/) print $4"-"$5,$0}' | sort -k1,1 --version-sort -r | sed -e "1,/$(uname -r | cut -f1,2 -d"-")/d" | grep -v -e `uname -r | cut -f1,2 -d"-"`
3.11.0-23 linux-image-extra-3.11.0-23-generic
3.11.0-23 linux-image-3.11.0-23-generic
3.11.0-23 linux-headers-3.11.0-23-generic
3.11.0-23 linux-headers-3.11.0-23
3.8.0-35 linux-image-extra-3.8.0-35-generic
3.8.0-35 linux-image-3.8.0-35-generic
ตอนนี้ตัดคอลัมน์แรกที่เราเพิ่มเข้าไปawk '{print $2}'
เพื่อรับสิ่งที่เราต้องการ:
$ dpkg -l linux-{image,headers}-* | awk '/^ii/{print $2}' | egrep '[0-9]+\.[0-9]+\.[0-9]+' | awk 'BEGIN{FS="-"}; {if ($3 ~ /[0-9]+/) print $3"-"$4,$0; else if ($4 ~ /[0-9]+/) print $4"-"$5,$0}' | sort -k1,1 --version-sort -r | sed -e "1,/$(uname -r | cut -f1,2 -d"-")/d" | grep -v -e `uname -r | cut -f1,2 -d"-"` | awk '{print $2}'
linux-image-extra-3.11.0-23-generic
linux-image-3.11.0-23-generic
linux-headers-3.11.0-23-generic
linux-headers-3.11.0-23
linux-image-extra-3.8.0-35-generic
linux-image-3.8.0-35-generic
ตอนนี้เราสามารถป้อนให้ผู้จัดการบรรจุภัณฑ์เพื่อลบทุกอย่างโดยอัตโนมัติและกำหนดค่าด้วงใหม่:
ฉันขอแนะนำให้ทำการรันแบบแห้งก่อน (แต่สำหรับวัตถุประสงค์ในการเขียนสคริปต์ของคุณสิ่งนี้อาจไม่เป็นประโยชน์หากคุณมีสภาพแวดล้อมขนาดใหญ่)
dpkg -l linux-{image,headers}-* | awk '/^ii/{print $2}' | egrep '[0-9]+\.[0-9]+\.[0-9]+' | awk 'BEGIN{FS="-"}; {if ($3 ~ /[0-9]+/) print $3"-"$4,$0; else if ($4 ~ /[0-9]+/) print $4"-"$5,$0}' | sort -k1,1 --version-sort -r | sed -e "1,/$(uname -r | cut -f1,2 -d"-")/d" | grep -v -e `uname -r | cut -f1,2 -d"-"` | awk '{print $2}' | xargs sudo apt-get --dry-run remove
ตอนนี้ถ้าทุกอย่างดูดีไปข้างหน้าและลบออกด้วย:
dpkg -l linux-{image,headers}-* | awk '/^ii/{print $2}' | egrep '[0-9]+\.[0-9]+\.[0-9]+' | awk 'BEGIN{FS="-"}; {if ($3 ~ /[0-9]+/) print $3"-"$4,$0; else if ($4 ~ /[0-9]+/) print $4"-"$5,$0}' | sort -k1,1 --version-sort -r | sed -e "1,/$(uname -r | cut -f1,2 -d"-")/d" | grep -v -e `uname -r | cut -f1,2 -d"-"` | awk '{print $2}' | xargs sudo apt-get -y purge
จุดรวมทั้งหมดของ "one-liner" นี้คือการลบเฉพาะเคอร์เนลเก่ากว่าเคอร์เนลที่รันอยู่ในปัจจุบัน (ซึ่งทำให้เมล็ดที่ติดตั้งใหม่ยังคงมีอยู่)