आइए एक-एक करके (मेरे सिस्टम के लिए) कोड को तोड़ें:
$ 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
पूरी apt-get remove
कमांड को ning :
$ 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
कर्ली अपग्रेड के रूप में पहले से ही उल्लिखित है ।
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
यदि आपके पास कोई संस्करण है जो वर्तमान से नया है तो यह आपको पहले कंप्यूटर को पुनः आरंभ करने की चेतावनी देगा। यह भी ध्यान दें कि पुराने कर्नेल एक अच्छे कारण के कारण संरक्षित हैं जो कि अगर आप किसी तरह अपने वर्तमान कर्नेल को गड़बड़ करते हैं जिससे आपका सिस्टम अस्थिर हो जाता है तो आपको किसी भी पुराने कर्नेल में बूट करने में सक्षम होना चाहिए।