यह? एप्ट-गेट रिमूव ’निर्देश क्या करता है?


10

निम्नलिखित कोड क्या करता है?

मुझे यह इंटरनेट पर मिला इसलिए मैंने इसे कॉपी किया और इसे टर्मिनल में पेस्ट किया लेकिन जब मैंने एक नया कर्नेल स्थापित किया तो यह केवल पुराने का पता लगाता है।

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')

दूसरा भाग एक नियमित अभिव्यक्ति है, यह परिभाषित करते हुए कि फ़ाइल का नाम कैसे दिखना चाहिए, लेकिन वास्तव में यह नहीं है कि यह किस फ़ाइल का नाम है। क्या यह एक कर्नेल स्थापित कर रहा है जो आपका उद्देश्य है या क्या यह पता लगा रहा है कि कमांड क्या हटाता है?
निकल्स लिंड्सकोग

यह कोड किसी भी कर्नेल को स्थापित नहीं करेगा , लेकिन उन्हें हटा दें! मैं नहीं देखता कि यह सेड-कमांड वास्तव में क्या करता है, लेकिन यह आउटपुट को प्रोसेस करता है dpkg -l 'linux-image-*', जो सभी इंस्टॉल किए गए कर्नेल पैकेज को सूचीबद्ध करता है और उनमें से कुछ को डिलीट करने के लिए फ़िल्टर करता है apt-get remove
बाइट कमांडर

16
अंगूठे से जीने का एक बहुत अच्छा नियम: यदि आप नहीं जानते कि एक कोड क्या करता है, तो उस कोड को टर्मिनल में न डालें जब तक कि कोई व्यक्ति यह नहीं जानता कि यह क्या बताता है। यदि आप अधिकतम कर्नेल प्राप्त करने का प्रयास कर रहे हैं, तो आप एक कोड का उपयोग करने के बजाय askubuntu.com/questions/119080/… को देखना चाह सकते हैं ।
कर्नल ट्रोगडोर

डिस्क पर आस-पास बैठे पुराने कर्नेल को कोई परेशानी नहीं होती है, केवल डिस्क स्थान को छोड़कर, और update-grub(पैकेज पोस्टस्टीन) धीमी बनाने के लिए। यदि आप चिंतित हैं कि आपने वास्तव में उस कर्नेल को बूट नहीं किया है जिसे आप अपग्रेड करने की कोशिश कर रहे हैं, तो चलाएं uname -a, या यहां तक ​​किdmesg | less
पीटर कॉर्डेस

7
"मैंने इसे इंटरनेट पर पाया, इसलिए मैंने इसे कॉपी किया और इसे टर्मिनल में पेस्ट किया" नो नो नॉट नो। आप अंत में दुर्घटना से भयानक चीजें करेंगे। रनिंग कोड आपको अपने सिस्टम को नुकीला करने और पिल्लों को लात मारने जैसी भयानक चीजों में परिणाम समझ में नहीं आता है ।
जर्नीमैन गीक

जवाबों:


12

आइए एक-एक करके (मेरे सिस्टम के लिए) कोड को तोड़ें:

$ 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

यदि आपके पास कोई संस्करण है जो वर्तमान से नया है तो यह आपको पहले कंप्यूटर को पुनः आरंभ करने की चेतावनी देगा। यह भी ध्यान दें कि पुराने कर्नेल एक अच्छे कारण के कारण संरक्षित हैं जो कि अगर आप किसी तरह अपने वर्तमान कर्नेल को गड़बड़ करते हैं जिससे आपका सिस्टम अस्थिर हो जाता है तो आपको किसी भी पुराने कर्नेल में बूट करने में सक्षम होना चाहिए।


उम, रुको, क्या? आप मूल, कार्यशील कोड को किसी अन्य कोड से प्रतिस्थापित करते हैं जो आपको लगता है कि "वास्तव में होना चाहिए (!!) होना चाहिए", निरीक्षण करें कि आपका "निश्चित" कोड टूट गया है और आपके वर्तमान कर्नेल को हटा देगा, और इस तरह यह निष्कर्ष निकालता है कि मूल कोड है " बहुत ही खतरनाक !! ” WTF? -1।
इल्मरी करोनें

मूल कोड की आलोचना करने के लिए निश्चित रूप से मान्य कारण हैं, जैसे कि ओली के जवाब में बताया गया है, और मुझे यकीन है कि sed कोड अधिक मजबूत हो सकता है। लेकिन यह तथ्य यह है कि सामान्य परिस्थितियों में (जैसे आपने अपने पिछले कर्नेल उन्नयन के बाद रिबूट किया गया है), मूल कोड काम करता है, जबकि आपका संशोधित डेटा काम नहीं करता है।
इल्मरी करोनन

1
सबसे पहले आपको आपके द्वारा उपयोग किए गए अंतिम शब्द का उपयोग नहीं करना चाहिए..नहीं, क्या आपने वास्तव में वास्तविक कोड चलाया था? apt-getभाग को हटाने और आपको क्या आउटपुट मिला?
हेमेयेल

@ इल्मारियारोन: ठीक है, मैं कुछ बिंदुओं में आपके साथ दूसरा हूं, मैंने उत्तर को संशोधित किया है ..
हेमलेल

क्यों, हाँ, मैं था अपने संशोधित आदेश (संस्करण उसके बाद एक लापता कोष्टक के कारण क्रैश नहीं होता चलाने (([a-z]|-)*, यह है कि) के बिना apt-getयह की आलोचना से पहले भाग। अपने सिस्टम पर, यह निम्नलिखित लाइनों आउटपुट: linux-image-3.13-, linux-image-3.13-, linux-image-extra-3.13-, linux-image-extra-3.13-, linux-image-3.13.0.49-generic। क्या वास्तव में आपका यही इरादा है? (इसके अलावा, बोनस अंक अगर आप यह जान सकते हैं कि मैं वास्तव में किस गुठली को स्थापित कर रहा हूं।)
इल्मरी करोनें

12

यह गुठली को हटाने का एक प्रयास है जो वर्तमान में नहीं है।

वहाँ कोड के कई बिट्स हैं जो कुछ इस तरह से करते हैं और यह एक अच्छा उदाहरण नहीं है । यह आसानी से नए-से-मौजूदा कर्नेल को हटा सकता है और इसलिए मेटा-पैकेज जो इंस्टॉल ( linux-genericएट अल) करता है यदि आपके पास अपग्रेड था और रिबूट नहीं था।


2
और यह बिल्कुल अच्छा विचार नहीं है। उन पुराने कर्नेल को तर्क के लिए रखा गया है, डिफ़ॉल्ट रूप से केवल 2 पुराने और एक चालू हैं।
बाराफू अल्बिनो
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.