Hãy phá mã từng cái một (cho hệ thống của tôi):
$ 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
Vì vậy, điều này sẽ không làm gì:
$ 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')
Như bạn có thể thấy nó rất gần với việc loại bỏ gói meta kernel hiện tại của tôi linux-image-generic 3.13.0.32.38 amd64 Generic Linux kernel image
(nhờ sed '/[0-9]/!d'
dòng cuối cùng này ), đó là sai.
Tóm lại, phần sed
này có một số vấn đề. Bạn nên tránh nó để loại bỏ hạt cũ của bạn.
BIÊN TẬP:
Tôi đã nói rằng sed
lệnh có vấn đề. Vì mục đích mở rộng, tôi sẽ xóa hai dòng cuối cùng với hình thức thực sự sẽ hoạt động trong kịch bản hiện tại của tôi.
Hai dòng cuối cùng trong một hình thức sửa đổi:
sed -r 's/^[^ ]* *(([a-z]|-)*)(-[a-z]*) *(([0-9]|-)*)\..*/\1-\4\3/'
Vì thế:
$ 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/'
Xuất sắc:
linux-image-3.13.0.32-generic
Đó là rất đáng sợ !!
Bây giờ hiển thị những gì điều này sẽ làm với hệ thống của tôi, --dry-run
với apt-get remove
lệnh đầy đủ :
$ 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]
Như bạn thấy, nó sẽ loại bỏ tất cả các nhân hiện tại của tôi, cũng lưu ý rằng đây chỉ là một mô phỏng để phù hợp với kịch bản hiện tại của tôi và bản gốc sed
có thể được cải thiện.
** Lưu ý rằng mã thực tế sẽ hoạt động nếu thực hiện reboot
nâng cấp kernel sau như Oli đã đề cập .
EDIT2:
Dưới đây là một tập lệnh đơn giản nhưng mạnh mẽ sẽ xem xét tất cả các tình huống và loại bỏ các nhân cũ thực tế:
#!/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
Nếu bạn có bất kỳ phiên bản nào mới hơn phiên bản hiện tại, điều này sẽ đưa ra cảnh báo khởi động lại máy tính của bạn trước. Cũng lưu ý rằng các hạt nhân cũ hơn được bảo tồn do một lý do chính đáng là nếu bạn bằng cách nào đó làm rối hạt nhân hiện tại của bạn làm cho hệ thống của bạn không ổn định thì bạn có thể khởi động vào bất kỳ hạt nhân cũ nào.