क्या यह आदेश पुरानी गुठली निकालने के लिए उपयोग करने के लिए सुरक्षित है?


21

उबंटू लेखों के लिए इंटरनेट ब्राउज़ करते समय, मैं इस कमांड में आया:

sudo dpkg -l 'linux-*' | sed '/^ii/!d;/'"$(uname -r | sed "s/\(.*\)-\([^0-9]\+\)/\1/")"'/d;s/^[^ ]* [^ ]* \([^ ]*\).*/\1/;/[0-9]/!d' | xargs sudo apt-get -y purge

लेखक ने कहा कि यह एक एकल पंक्ति कमांड है जो लिनक्स के सभी पिछले संस्करणों को हटा देगा , केवल वर्तमान एक को छोड़कर !

मैं वास्तव में इस तरह के कमांड की तलाश कर रहा हूं, लेकिन मुझे इस पर यकीन नहीं है कि यह कितना सुरक्षित है। मैं जानना चाहता हूं:

  • क्या इस कमांड को निष्पादित करना सुरक्षित है?
  • यह कमांड कैसे काम करता है? यानी इतने बड़े कमांड के छोटे हिस्से की व्याख्या
  • यदि यह कमांड कुछ अलग उद्देश्य प्रदान करता है, तो लेखक क्या करने का दावा करता है, इसे प्राप्त करने के लिए सही कमांड क्या होगा?

मैं बहुत भ्रमित हो जाता हूं और निराश हो जाता हूं जब मैं अपने आप को जानने की कोशिश करता हूं। कैसे इस आदेश काम करता है उसमें शामिल करने के लिए कई /, |, \, *, और ^वर्ण जिनके लिए Google के लिए कड़ी मेहनत कर रहे हैं।

मैं इस कमांड के लिए स्टेप ट्रांसलेशन और स्पष्टीकरण के लिए एक कदम की तलाश कर रहा हूं, जिसे मैं इंटरनेट पर नहीं पा रहा था!


1
यह वही आदेश नहीं लगता है जो आप उद्धृत करते हैं, लेकिन मैं बिना किसी मुद्दे के पुरानी गुठली निकालने के लिए tuxtweaks.com/2010/10/… में कमांड का उपयोग कर रहा हूं । यह पृष्ठ यह भी बताता है कि कमांड क्या करता है।
user68186

4
@UriHerrera apt-get autoremoveमेरे लिए पुराने गुठली के किसी भी हटाने का सुझाव नहीं देता है। अगर मैं उन्हें नहीं हटाता हूं, तो वे तब तक ढेर करेंगे जब तक कि मेरा /bootस्थान खाली न हो जाए और अपडेट विफल रहे। क्या आपके पास इसके बारे में कोई संदर्भ है कि इसे ऐसा करना चाहिए?
gertvdijk

1
यह मेरे लिए करता है, जब भी कर्नेल के लिए कोई नया अपडेट आता है, तो यह कहता है कि इसके बाद के पैकेज आदि, अब आवश्यक नहीं हैं और यह पिछले कर्नेल को सूचीबद्ध करता है जो मेरे पास था।
उरी हरेरा

मेरा उत्तर एक मॉडरेटर द्वारा हटा दिया गया था, इसलिए मैं यहां टिप्पणी करता हूं: स्क्रिप्ट के स्पष्टीकरण के लिए यह लेख देखें । मैं यह नहीं देखता कि स्क्रिप्ट का एक हिस्सा s/^[^ ]* [^ ]* \([^ ]*\).*/\1/बस के बजाय क्यों है s/^[^ ]* \([^ ]*\).*/\1/। स्क्रिप्ट बहुत मजबूत या सुरुचिपूर्ण नहीं है। उदाहरण के लिए आउटपुट से पैकेज का नाम निकालने से पहले वर्तमान कर्नेल की जांच क्यों करें? एक विकल्प के रूप में, sudo apt-get autoremove --purgeउबंटू के कुछ नवीनतम रिलीज में सबसे पुरानी गुठली को शुद्ध करता है जैसे कि ज़ुबांटा 15.10।
जर्नो डे

जवाबों:


27

मैं कहता हूँ: वर्तमान रूप में इसका उपयोग न करें

  1. यह आपसे पूछे बिना बदलाव करता है। apt-get -y purgeभाग आपकी पुष्टि के बिना, एक लाइनर शुद्धिकरण पैकेज को क्रियान्वित करने शुरू करने के लिए अनुमति देता है। यदि स्क्रिप्ट में कोई त्रुटि मौजूद है, तो आप खराब हो सकते हैं

  2. कोई स्रोत नहीं, कोई लेखक नहीं दिया गया। इसके स्रोत से यहां फर्क पड़ता है। मामले में यह एक अच्छी तरह से परीक्षण किए गए सिस्टम पैकेज से आएगा जिसे हम इस पर किए जा रहे परीक्षण का पता लगा सकते हैं। एक यादृच्छिक स्रोत से, हम इस पर भरोसा नहीं कर सकते।

  3. dpkg -lबिना ठीक चलता है sudo। मैं यह नहीं देखता कि मूल लेखक ने क्यों सोचा कि यह आवश्यक था।

सामान्य ज्ञान का उपयोग करें

हानिकारक भागों को हटा दें और जड़ के रूप में चलने वाली किसी भी चीज़ को छोड़ दें।

उदाहरण के लिए, इसे नीचे काटें:

dpkg -l 'linux-*' | sed '/^ii/!d;/'"$(uname -r | sed "s/\(.*\)-\([^0-9]\+\)/\1/")"'/d;s/^[^ ]* [^ ]* \([^ ]*\).*/\1/;/[0-9]/!d'

जो कि केवल सामान का उत्पादन करता है और नियमित उपयोगकर्ता अनुमतियों के साथ चलता है । एक बार जब आप इन गुठली को हटाने के लिए सहमत हो जाते हैं, तो आप खुद को जोड़ सकते हैं | xargs sudo apt-get purge। यह -yविकल्प के बिना है , जानबूझकर, इसलिए आपसे आपके सिस्टम में किए जाने वाले परिवर्तनों की पुष्टि के लिए कहा जाएगा।

व्याख्या

  • dpkg -lसभी पैकेजों की सूची को आउटपुट करता है। इस मामले में यह केवल संकुल सूची जाएगा शुरू करने के साथ linux-नाम के रूप में।
  • |(एक पाइप) बाईं ओर कमांड के आउटपुट को पाइप करता है (हम कॉल करते हैं stdout) कमांड के इनपुट को दाईं ओर (हम कॉल करते हैं stdin)।
  • sedनियमित अभिव्यक्ति का उपयोग करके तार को हेरफेर करने का एक उपकरण है । इस मामले में यह स्थापित पैकेज के लिए पाइप और फिल्टर के बाईं ओर कमांड के आउटपुट में हेरफेर करता है ( iiद्वारा दिए गए अनुसार निर्भर करता है dpkg)। यह इस मामले में भी नेस्टेड है। यहां पूरे उपयोग की व्याख्या करना बहुत कठिन होगा sed, क्योंकि इसका उपयोग जटिल नियमित अभिव्यक्तियों के साथ बहुत जटिल है। (यह \(.*\)-\([^0-9]\+\)"एक नियमित अभिव्यक्ति का एक उदाहरण है।
  • नियमित अभिव्यक्तियाँ बहुत व्यापक रूप से अभिव्यक्ति का प्रतिनिधित्व करने के आधार पर मैच खोजने के लिए उपयोग की जाती हैं। \1एक प्रकार का सार्वभौमिक खोज-और-प्रतिस्थापन करने के लिए प्रतिस्थापन संदर्भ है (पहले 'हिट' के साथ संदर्भित 1)। नियमित अभिव्यक्ति स्वयं कोई नुकसान नहीं कर सकती है। हालांकि, यदि वे गलत तरीके से इनपुट में हेरफेर करते हैं, तो वे गलत पैकेज को हटा सकते हैं या शेल इंजेक्शन भी कर सकते हैं। इस मामले में, यह प्रदान किए गए संस्करण के आधार पर कर्नेल पैकेज का नाम खोजने का एक तरीका है uname -r
  • uname -r चालू कर्नेल के वर्तमान संस्करण को आउटपुट करता है।
  • xargsकमांड के तर्क के रूप में पाइप के बचे इनपुट की लाइनों को जोड़ता है। इस स्थिति में, प्रत्येक लाइन पर कर्नेल संस्करण एक क्षैतिज स्थान-पृथक सूची में परिवर्तित हो जाते हैं और sudo apt-getकमांड में जुड़ जाते हैं ।
  • sudo apt-get -y purge [packagename] दिए गए पैकेजों (तर्कों के रूप में) को शुद्ध करता है।

वैकल्पिक

काफी कुछ सवाल शायद इस बारे में पहले से ही पूछे जाते हैं। मैं अब तक पाया प्रासंगिक:


1
इस कमांड के डरावने दिखने वाले नोड का ब्रेकअप क्या होगा जो कुछ इस तरह से है ((.*)-( इस नंबर पर- ^ ] * [^] * ([^] *)। * / \ / 1 /; /
भावेश दीवान

क्या उक्त आदेश इस उत्तर को पुरानी गुठली स्पष्ट रूप से स्पष्ट करेगा ?? या अभी भी उपयुक्त हो ऑटोरेमोव बेहतर है ??
भावेश दीवान

4
@ Z9iT वे नियमित अभिव्यक्ति हैं। वे अभिव्यक्ति के आधार पर मिलान खोजने के लिए उपयोग किए जाते हैं और \1सार्वभौमिक खोज और प्रतिस्थापन के एक प्रकार को करने के लिए प्रतिस्थापन नियंत्रण है। किसी भी पैकेज को हटाने के लिए मैंने अपने जवाब में खुद को स्पष्ट किया है (मेरी राय है): सामान्य ज्ञान का उपयोग करें। स्क्रिप्ट को अपने सिस्टम में स्वचालित रूप से परिवर्तन न करने दें। सत्यापित करें कि यह क्या करेगा। हमेशा।
gertvdijk

आपके द्वारा चुना गया विकल्प संबंधित लिनक्स-हेडर पैकेज को शुद्ध नहीं करता है।
जर्नो

फिर बस एक उपयुक्त ऑटोरेमोव करें, जो यह पता लगाना चाहिए कि हेडर की अब आवश्यकता नहीं है।
बेन-नबी डेरुष

7

आपने एक चरण-दर-चरण स्पष्टीकरण मांगा ताकि यहां यह हो:

sudo dpkg -l 'linux-*'

linux-पैकेज के नाम से शुरू होने वाले पैकेज को सूचीबद्ध करता है

| sed

और सूची में पाइप sed

"s/\(.*\)-\([^0-9]\+\)/\1/")"'/d;s/^[^ ]* [^ ]* \([^ ]*\).*/\1/;/[0-9]/!d'

जो सूची को संपादित करने के लिए एक बहुत ही जटिल नियमित अभिव्यक्ति का उपयोग करेगा

| xargs

जो नई सूची को पाइप करेगा xargs, जो इसे तर्क के रूप में भेजेगा

sudo apt-get -y purge

जो आपको अपना मन बदलने का मौका दिए बिना उन पैकेजों को शुद्ध कर देगा।

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

क्या ये सुरक्षित है? इस मामले में, यह सब इस बात पर निर्भर करता है कि आपने जिस पोस्ट को पाया है, वह वहां के रेगुलर एक्सप्रेशंस और sedसिंटैक्स को कितनी अच्छी तरह समझता है । और उन दोनों विषयों पर पूरी किताबें हैं।


6

मैंने कमांडों को विच्छेदित करके शुरू किया, manप्रत्येक के लिए पृष्ठ को पढ़ना ।

  • dpkg -l: pacakges को सूचीबद्ध करें, इसलिए dpkg -l linux-*उन सभी पैकेजों को सूचीबद्ध करेगा जो linux-(आमतौर पर गुठली) के साथ शुरू हुए थे ।

  • sed: के आउटपुट को कई नियमित अभिव्यक्तियों के साथ dpkg -l linux-*पाइप किया sedजाता है जो sedडिकोड करता है।

  • uname -r unameप्रिंट सिस्टम जानकारी

uname - प्रिंट सिस्टम की जानकारी

-rसंभाल विशेष रूप से गिरी विज्ञप्ति प्रिंट:

-r, - कर्नेल-रिलीज़ कर्नेल रिलीज़ प्रिंट करें

तब का आउटपुट अधिक नियमित अभिव्यक्ति के साथ uname -rपाइप किया sedजाता है, जिसके आउटपुट को पास किया जाता हैxargs

इसलिए आउटपुट को पैकेज नामों में xargsअनुवादित करता है sedऔर उन्हें पास करता है, sudo apt-get purge -yजिस पर स्वचालित रूप से सभी संकेतों के लिए 'हां' का जवाब देता है:

-y, --yes, -assume-Yes स्वचालित हां के लिए संकेत देता है; सभी संकेतों के उत्तर के रूप में "हाँ" मानें और गैर-संवादात्मक रूप से चलाएं। यदि एक अवांछनीय स्थिति, जैसे कि एक आयोजित पैकेज को बदलना, एक अनअथेंटेड पैकेज को स्थापित करने या एक आवश्यक पैकेज को हटाने की कोशिश करना तब होता है, तो उपयुक्त-मिलन निरस्त हो जाएगा। कॉन्फ़िगरेशन आइटम: APT :: Get :: मान लें-हां।

कुल मिलाकर ऐसा लगता है कि यह कमांड वही करेगा जो आप चाहते हैं, हालांकि यह जानने के लिए कि हमें sedनियमित अभिव्यक्तियों का अनुवाद करना होगा ।

मैं अभी भागा:

dpkg -l 'linux-*' | sed '/^ii/!d;/'"$(uname -r | sed "s/\(.*\)-\([^0-9]\+\)/\1/")"'/d;s/^[^ ]* [^ ]* \([^ ]*\).*/\1/;/[0-9]/!d'  

यहाँ एक स्क्रीनशॉट है:

यहां छवि विवरण दर्ज करें

सभी पुराने कर्नेल संस्करण iirc।


इस sed की अभिव्यक्ति का अनुवाद करने के लिए क्या कसरत है?
भावेश दीवान

2
मैं इसे अभी समझने की कोशिश कर रहा हूं, हमें थोड़ा समय लग सकता है;)
सेठ


@ Z9iT मैं लिंक से जुड़े लेख से उत्तर के लिए स्क्रिप्ट की व्याख्या की नकल करने के लिए बहुत आलसी था, इसलिए मुझे लगता है कि सेठ ने मेरे जवाब को हटा दिया। लेकिन मुझे लगता है कि जुड़ा हुआ लेख वह है जो आप इंटरनेट से देख रहे थे। मैंने आपको पुरानी गुठली निकालने का एक सुरक्षित तरीका भी बताया था, हालांकि यह केवल मामले में 2-3 गुठली रखता है, और अभी तक सभी मौजूदा उबंटू रिलीज में काम नहीं कर सकता है।
जर्नो

@jarno मैंने इसे हटा दिया क्योंकि Z9iT एक विशिष्ट कमांड के बारे में पूछ रहा था , न कि पुरानी गुठली निकालने का एक सुरक्षित तरीका। यह अभी भी प्रासंगिक हो सकता है, लेकिन एक टिप्पणी में, एक जवाब नहीं :) (जैसे आपने किया था)
सेठ
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.