उपयुक्त-वाइल्डकार्ड के साथ हटाए जाने की उम्मीद से अधिक रास्ता निकाल दिया। क्यूं कर?


38

कल रात मैं सीडी जलाने की कोशिश कर रहा था। K3b से परेशान होने और इसके बजाय brasero का उपयोग करने के लिए चुनने के कारण, मैं k3b को हटाने गया।

में टाइप किया:

sudo apt-get remove k3b

मैंने दो बार टैब मारा और देखा कि मेरे सिस्टम पर k3b और k3b-data दोनों हैं। यह मानते हुए कि मुझे k3b के बिना अपने सिस्टम पर k3b-data की आवश्यकता नहीं है, मैं इसे भी हटाना चाहता था, इसलिए मैंने इसमें काम किया:

sudo apt-get remove k3b*

दुर्भाग्य से मैंने बिना देखे पुष्टि करने के लिए वाई को मारा। यह एक पूरी की तुलना में बहुत अधिक की स्थापना रद्द की k3bऔर k3b-data। इसने उन पैकेजों को अनइंस्टॉल कर दिया जो मेरे k3b*रेगेक्स में फिट नहीं थे । उदाहरण के लिए: transmissionऔर network-manager

मैं काफी हद तक निश्चित है कि मैं के बीच एक रिक्ति नहीं था हूँ k3bऔर *लेकिन मैं किसी और कारण है कि यह सब है कि यह किया हटाने पता नहीं है। क्या कोई बात है कि मैं गलतफहमी पा रहा हूँ?


जवाबों:


38

आप जो आदेश चाहते हैं sudo apt-get remove '^k3b.*', वह है :

  • आपको .*किसी भी वर्ण, किसी भी समय मेल खाना चाहिए
  • आपको ^स्ट्रिंग की शुरुआत से मेल खाना चाहिए
  • आपको *वाइल्डकार्ड के रूप में व्याख्या करने से रोकने के लिए रेगेक्स को उद्धृत करने की आवश्यकता है

(यह उत्तर क्यूबी और फ्लिम द्वारा प्रदान की गई पिछली जानकारी को पूरा और सारांशित करता है)


5
यह सुरक्षित है और इसका उपयोग करना ठीक है लेकिन आपको इसकी आवश्यकता नहीं है .*। आप बस उपयोग कर सकते हैं sudo apt-get remove ^k3b। की उपस्थिति ^के लिए पर्याप्त है तर्क एक नियमित अभिव्यक्ति के रूप में व्याख्या की जा करने के लिए पैदा करने के लिए है, और जब aptया apt-getव्याख्या एक नियमित अभिव्यक्ति के रूप में एक तर्क है, यह इसके मेल खाता है कहीं भी पैकेज के नाम पर। यही कारण है कि आप की जरूरत है ^--to लंगर पैकेज नाम के शुरू करने के मैच। नियमित अभिव्यक्ति को पूरे पैकेज के नाम से मेल खाने की जरूरत नहीं है, बस इसके किसी भी हिस्से को।
एलियाह कगन

1
अतिरिक्त जानकारी के लिए @EliahKagan Thx! (और वास्तव में, यह समझ में आता है कि अगर आपको ज़रूरत है ^, तो आपको ज़रूरत नहीं है .*)
बोरिस डेलस्टीन

30

नियमित अभिव्यक्ति *शून्य या मनमाने ढंग से कई के लिए खड़ा है। तो आपने किसी भी apt-getचीज को हटाने के लिए कहा, जिसमें k3किसी भी संख्या का पालन किया गया है b, इसलिए मूल रूप से वह सब कुछ है जिसमें शामिल है k3। अगर मैं अपने सिस्टम पर आपकी कमांड की कोशिश करता हूं तो यह 58 पैकेज निकालना चाहता है।

sudo apt-get remove -s k3b*
Package k3b is not installed, so not removed
Package k3b-data is not installed, so not removed
Package k3b-dbg is not installed, so not removed
Package libcanberra-gtk3-0 is not installed, so not removed
Package libcanberra-gtk3-0-dbg is not installed, so not removed
Package libcanberra-gtk3-dev is not installed, so not removed
…
The following packages will be REMOVED:
  appmenu-gtk ardour audacity brasero brasero-cdrkit firefox-globalmenu
  gconf-editor gir1.2-appindicator-0.1 gnome-applets gnome-control-center
…
0 upgraded, 2 newly installed, 58 to remove and 0 not upgraded.

ओह! मैं इन darn windows मशीनों पर काम कर रहा हूँ (जहाँ * बस का अर्थ है "और" के बाद कुछ भी) रास्ते के लिए बहुत लंबा!
स्टीव गोयकोविच

14
*डॉस में की तरह पार्टी के लिए वाइल्डकार्ड के रूप में काम करता है, लेकिन कुछ आदेश की तरह apt-getएक regex की उम्मीद है। जब आप टाइप करते हैं sudo apt-get remove -s k3b*, तो bash सबसे पहले आपकी वर्तमान डायरेक्टरी की किसी भी फाइल को खोजेगा, जो इसके साथ शुरू होती है k3b। यदि यह किसी को भी मिल जाए, तो यह उस तर्क को उन फ़ाइलनामों से बदल देगा। यदि नहीं, तो यह k3b*सीधे पास हो जाएगा apt-get, जो इसे एक रेगीक्स के रूप में व्याख्या करेगा। यदि आप पहले एक वाइल्डकार्ड के रूप में तारांकन की व्याख्या करने के लिए बैश नहीं करना चाहते हैं (जो कि आप शायद नहीं करते हैं), इस तरह एकल उद्धरण के साथ तर्क को sudo apt-get remove -s 'k3b*'
घेरें

3
तो अभीष्ट आज्ञा होती sudo apt-get remove -s 'k3b.*'। बस इस जवाब पर ठोकर खाई और यह जानना वास्तव में महत्वपूर्ण है। IMHO यह काफी अप्रत्याशित है और मैं इसे पर्याप्त रूप से उपयुक्त "अप्रत्याशित व्यवहार" के रूप में चिह्नित करूंगा ... आप सामान्य रूप से "ग्लोब" अर्थ की उम्मीद करते हैं और निर्दिष्ट न होने पर "रेगेक्सप" का अर्थ नहीं। वैसे भी धन्यवाद और +1!
रमानो

1
और मेरे जैसे उन लोगों के लिए जो नहीं जानते थे: -sविकल्प का अर्थ "सिमुलेशन" है। यह apt-getऑपरेशन नहीं करने के लिए कहता है , लेकिन -sविकल्प के बिना क्या होगा इसकी जानकारी देने के लिए ।
बोरिस डालस्टीन

मुझे लगता है कि ग्लोबिंग बनाने के लिए एकल उद्धरणों का आपका उपयोग कम से कम कठपुतली में काम नहीं करता है। और वह है अप्रत्याशित। 'फाइंड' प्रोग्राम में, यदि मैं खोज / / 'प्रोजेक्ट' लिखता हूं, तो 'मुझे प्रोजेक्ट के साथ शुरू होने वाली हर चीज मिल जाएगी, न कि ऐसी चीज, जिसमें' प्रोजेक्ट 'हो और उसके बाद कुछ भी हो। कठपुतली के बारे में सबूत के रूप में, ध्यान दें कि मेरे परिणाम 'रेगेक्स' कैसे कहते हैं, और परिणाम इसे साबित करते हैं?
डेनिस

9

sudo apt-get remove ^k3bइसके बजाय उपयोग करें । जब आप पैकेज स्थापित या हटाते हैं, *तो अक्सर खतरनाक होता है और शायद ही कभी इसकी आवश्यकता होती है। यदि आप उपयोग करते हैं *, तो आपको इसे उद्धृत करना चाहिए, लेकिन यह इसे अधिक सुरक्षित नहीं बनाता है, क्योंकि इसका इरादा आप की तुलना में कहीं अधिक संकुल का चयन करने का तरीका है aptऔर apt-getइसका अर्थ है कि व्याख्या करना और पथनाम विस्तार का प्रभाव नहीं

  • यहां तक कि के सुरक्षित उपयोग करता* हैं अक्सर अनावश्यक
  • असुरक्षित उपयोग क्रूर हैं । हटाने से k3b*हर पैकेज को हटा दिया जाता है जिसमें k3 कहीं भी उसका नाम हो (और हर पैकेज जो ऐसे पैकेज पर निर्भर करता है)। यह एक टाइपो नहीं k3है, जिसमें पर्याप्त है, यहां तक ​​कि बिना भी b, क्योंकि b*इसका मतलब है "शून्य या अधिक bएस।"

आप समाप्त हो जाता है aptया apt-getके साथ install, removeया purgeकार्रवाई, प्रत्येक अनुवर्ती तर्क पहला है 1 एक व्यक्ति पैकेज के नाम के रूप में व्याख्या की। यदि उस सटीक नाम वाला पैकेज मौजूद है, तो इसके लिए कार्रवाई की जाती है।

अगर ऐसी कोई पैकेज है, aptऔर apt-getतर्क आम के किसी भी शामिल करता है, तो जाँच करेगा नियमित अभिव्यक्ति अक्षरों से परे 2 . , ?, +,* , |, \[, ^, या$ । यदि नहीं, तो यह हो गया है - कोई पैकेज नहीं मिला।

यह तो है उन अक्षर शामिल है, तो यह एक नियमित अभिव्यक्ति के रूप में इलाज और के खिलाफ मिलान किया जाता है किसी भी भाग किसी भी पैकेज नाम की। यह पूरे नाम से मेल नहीं खाता है। जैसा कि दूसरों ने कहा है, *एक नियमित अभिव्यक्ति *में एक ग्लोब की तरह एक ही चीज का मतलब नहीं है । ?या तो नहीं है। एक नियमित अभिव्यक्ति में:

  • *पिछले आइटम को किसी भी समय प्रदर्शित करने की अनुमति देता है - केवल एक बार या बिल्कुल नहीं - केवल एक बार के बजाय।
  • ?पिछले आइटम को वैकल्पिक बनाता है - यह क्या है, यह इसे शून्य या एक बार प्रदर्शित करने की अनुमति देता है।

apt-get (8) ( man apt-get) कहता है:

यदि कोई पैकेज दी गई अभिव्यक्ति से मेल नहीं खाता है और अभिव्यक्ति में ',', '?' या '*' तब इसे POSIX नियमित अभिव्यक्ति माना जाता है, और इसे डेटाबेस में सभी पैकेज नामों पर लागू किया जाता है। किसी भी मैच को तब स्थापित किया जाता है (या हटाया जाता है)। ध्यान दें कि मैचिंग 'लो * के विकल्प द्वारा की जाती है।' कैसे-लो 'और' निम्नतम 'से मेल खाता है। यदि यह अवांछित है, तो '^' या '$' वर्ण के साथ नियमित अभिव्यक्ति को एंकर करें, या अधिक विशिष्ट नियमित अभिव्यक्ति बनाएं।

मैनपेज केवल उल्लेख है ., ?और *है, लेकिन यह अधूरा है , के रूप में +, |, [, ^, और $भी जाने के लिए पर्याप्त हैं apt-getया aptएक नियमित अभिव्यक्ति के रूप में पैटर्न की व्याख्या। 3

यद्यपि आप किसी भी वर्ण के किसी भी संख्या के साथ मेल कर सकते हैं .*- केवल - बल्कि आपको* इसकी आवश्यकता है यदि यह आपकी नियमित अभिव्यक्ति के बीच में दिखाई देगा । क्योंकि पैटर्न पैकेज के किसी भी नाम के विकल्प के साथ मेल खाता है, यह पैटर्न के अंत (या शुरुआत) में व्यर्थ है।

मैनपेज का उल्लेख है ^और$ । ये (विशेष रूप से ^) के साथ उपयोग के लिए सुरक्षित, कुशल पैटर्न लेखन के लिए महत्वपूर्ण हैं install, removeया purgeमें कार्रवाई aptया apt-get

  • ^पूरे स्ट्रिंग की शुरुआत के लिए एक नियमित अभिव्यक्ति लंगर । ^k3bउन सभी पैकेजों का चयन करता है जिनके नाम से शुरू होता है k3b
  • $पूरे स्ट्रिंग के अंत तक एक नियमित अभिव्यक्ति लंगर । k3b$उन सभी पैकेजों का चयन करेगा जिनके नाम के साथ समाप्त होता है k3b

इसलिए आप संकुल को सुरक्षित रूप से हटाने के लिए इस कमांड का उपयोग कर सकते हैं:

sudo apt-get remove ^k3b

अंत में, आपके द्वारा बताए गए विशिष्ट मामले में, आप दोनों नामों को स्वयं पास कर सकते हैं:

sudo apt-get remove k3b k3b-data

तब आप इस सारी जटिलता से बच जाते हैं! (हालांकि इसके साथ ^उपयोग करने के बाद एंकरिंग करना सरल है।) या ब्रेस विस्तार का उपयोग करें , जो आपके शेल को उपरोक्त कमांड में विस्तारित करता है:

sudo apt-get remove k3b{,-data}

1 इस के लिए दो अपवाद हैं: (क) कुछ विकल्प (जैसे, -f, --purge) पहचाने जाते हैं, और (ख) कुछ विराम चिह्न पर प्रदर्शित होने के पात्रों अंत एक तर्क है कि अन्यथा कार्रवाई करने के लिए किया जा सकता है एक पैकेज के नाम के लिया जाएगा की जो किया जाता है उसे बदलने के लिए उपयोग किया जाता है (उदाहरण के लिए, पैकेज के बजाय कार्य कोsudo apt install ubuntu-desktop^ स्थापित करता है , और जब अंत में प्रकट होता है)।^

2 अन्य नियमित अभिव्यक्ति रूपक मौजूद हैं। उदाहरण के लिए, \नियमित रूप से और आमतौर पर इस्तेमाल होने वाली सभी बोलियों द्वारा समर्थित है। ., ?, +, *, |, [, ^, और $सिर्फ अक्षरों से परे अपार्ट डेवलपर्स के लिए रेगुलर एक्सप्रेशन के रूप में व्याख्या ट्रिगर करेगा फैसला किया जा करने के लिए होता है (नाम एक सटीक पैकेज के रूप में संकल्प के बाद विफल हो गई है)।

3 यह सत्यापित करने का सबसे आसान तरीका -sऊपर वर्णित विकल्प का उपयोग करके इस तरह के पैटर्न के साथ स्थापना या हटाने का अनुकरण करना है। उदाहरण के लिए, रनिंग apt -s install ^virtualboxशो जिसमें sudo apt install ^virtualboxहर पैकेज को स्थापित करने के प्रयास का प्रभाव होता है, पैकेज मैनेजर को पता होता है कि किसका नाम किसके साथ शुरू होता है virtualbox। हालांकि, इस व्यवहार को स्रोत कोड की जांच करके भी सत्यापित किया जा सकता है । में CacheSetHelper::PackageFromRegExफ़ंक्शन की जाँच करें cacheset.cc


1

तब आप संभवतः एक ऐसे दायित्व को हटा सकते हैं जिसमें k3b था, जो उन कार्यक्रमों पर निर्भर था।

संक्षेप में आप कभी नहीं जान सकते हैं। मेरा सुझाव है कि वाइल्डकार्ड का उपयोग चीजों को हटाने के लिए न करें और जब संकेत दिया जाए तो चीजें पढ़ें।

साथ ही -n regex खोजों के साथ सभी फ़ील्ड्स का उपयोग होता है और न केवल नामों का

http://ccrma.stanford.edu/planetccrma/man/man8/apt-cache.8.html

यह भी कि क्यूबी सही है आपका रेगेक्स गेट-गो से त्रुटिपूर्ण है


एक अन्य बात, आपके (k3b और k3b डेटा) जैसे मामलों में apt-get uninstall k3b है। Apt तब आपको सूचित करेगा यदि आपके पास ऐसी चीजें स्थापित हैं जिनकी आपको अब आवश्यकता नहीं है, और उन्हें हटाने के लिए आपको क्या करने की आवश्यकता है।
coteyr

वाह! मुझे उम्मीद नहीं थी कि यह विवरणों के भीतर भी खोज करेगा! हाँ, यह निश्चित रूप से कुछ है जो मैं फिर कभी नहीं करूँगा! (और मैं अगली बार चीजों को पढ़ना सुनिश्चित करूंगा: P)
स्टीव गोयकोविच

लिंक टूट गया है, क्या आप स्पष्ट करेंगे कि एन का उपयोग कैसे करें?
सीनैज़ी

-n का मतलब केवल नाम क्षेत्र में खोज है।
coteyr

कोशिश करने के बाद apt-get remove, केवल विकल्प द्वारा पहचाना नहीं जाता है apt-get cache। ऐसा लगता है कि वास्तव में, apt-get removeकेवल पैकेज नामों की तलाश है, विवरणों की नहीं।
बोरिस डेलस्टीन
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.