"उपयुक्त-निकालें हटाएं" का उपयोग करते समय वर्तमान में स्थापित नहीं किए गए पैकेजों को अनदेखा करें


15

मेरे पास एक ऐसा परिदृश्य है जहां मैं उन पैकेजों का एक सेट निकालना चाहता हूं जो स्थापित हो सकते हैं या नहीं भी हो सकते हैं, और मैं चाहूंगा कि जो भी हैं उन्हें हटा दें और चुपचाप उन चीजों को अनदेखा करें जो कि नहीं हैं। कुछ इस तरह:

apt-get remove foo bar baz

जो, अगर फू और बार स्थापित किए गए थे, लेकिन बाज नहीं था, तो बाज और शिकायत के बिना फू और बार को हटा देगा। क्या इसे करने का कोई तरीका है?

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

jcp@a-boyd:~$ sudo apt-get remove -y cups-dbg bogus-package
Reading package lists... Done
Building dependency tree       
Reading state information... Done
E: Unable to locate package bogus-package

jcp@a-boyd:~$ sudo apt-get remove --ignore-missing cups-dbg bogus-package
Reading package lists... Done
Building dependency tree       
Reading state information... Done
E: Unable to locate package bogus-package

jcp@a-boyd:~$ sudo apt-get remove --fix-broken cups-dbg bogus-package
Reading package lists... Done
Building dependency tree       
Reading state information... Done
E: Unable to locate package bogus-package

मुझे पता है कि मैं एक शेल स्क्रिप्ट और कुछ dpkg --listजादू के साथ ऐसा कर सकता हूं , लेकिन मैं किसी भी जटिलता से बचना चाहता हूं जो बिल्कुल आवश्यक नहीं है।


इस जवाब ने मेरे लिए अंत में काम किया । गूंगा समस्या के लिए गूंगा तय करें। ध्यान दें कि इस बारे में लॉन्चपैड पर वास्तव में एक दोष है ताकि योगदान करने के लिए स्वतंत्र महसूस हो।
जेफ

जवाबों:


8

क्या निचले स्तर के टूल जैसे dpkg का विकल्प वापस गिर रहा है ?

dpkg --remove foo bar libperl-dev
dpkg: warning: ignoring request to remove foo which isn't installed
dpkg: warning: ignoring request to remove bar which isn't installed
(Reading database ... 169132 files and directories currently installed.)
Removing libperl-dev ...

संकुल को हटाने के लिए विन्यास फाइल नीचे के रूप में पर्ज का उपयोग करती है

dpkg --purge foo bar libperl-dev

1
मुझे यह उल्लेख करना चाहिए कि हटाए जाने वाले पैकेजों पर रिवर्स निर्भरता हो सकती है, और मैं चाहूंगा कि उन्हें भी हटा दिया जाए। Apt-get इसलिए dpkg से बहुत बेहतर है, लेकिन मैं आपके उत्तर को स्वीकार करूंगा क्योंकि ऐसा लगता है कि ऐसा करने का वास्तव में बेहतर तरीका नहीं है।
ज्वालामुखी

7

मैं पैकेज की सूची के साथ निर्भरता के लिए apt-get remove --purge(उर्फ apt-get purge) का उपयोग करता हूं । उन पैकेजों को संभालने के लिए जो मौजूद नहीं हैं, मैं निम्नलिखित स्क्रिप्ट के साथ स्थापित नहीं किए गए पैकेजों को फ़िल्टर करता हूं।

pkgToRemoveListFull="cups-dbg bogus-package"
pkgToRemoveList=""
for pkgToRemove in $(echo $pkgToRemoveListFull); do
  $(dpkg --status $pkgToRemove &> /dev/null)
  if [[ $? -eq 0 ]]; then
    pkgToRemoveList="$pkgToRemoveList $pkgToRemove"
  fi
done
apt-get --yes --purge remove $pkgToRemoveList

3

डेबियन De 9 के लिए, इसके aptitudeबजाय इसका उपयोग करना संभव है apt-get:

sudo aptitude remove -y cups-dbg bogus-package

एप्टीट्यूड चेतावनी देता है, लेकिन फिर भी अपने पैकेजों को निकालना जारी रखता है:

Couldn't find any package whose name or description matched "bogus-package"
...
Removing cups-dbg ...
...

यदि आप हटाना चाहते हैं (संकुल कॉन्फ़िगर फ़ाइलों को हटाना) (बजाय कॉन्फ़िगर फ़ाइलें रखें), ध्यान दें कि aptitudeकेवल सीधे दिए गए पैकेजों को ही शुद्ध करता है, जबकि अप्रयुक्त निर्भरताएँ केवल हटा दी जाती हैं। हालाँकि, आप एक दूसरे चरण में सभी निकाले गए पैकेजों को शुद्ध कर सकते हैं:

apt-get -y purge $(dpkg -l | grep ^rc | awk '{print $2}')

ठीक। कभी-कभी, bogus-packageबस गलत नाम था। इसलिए, अगर हमें 500 पैकेज पसंद आते हैं, तो बेहतर होगा कि फर्जी पैकेजों का भी विश्लेषण करें और कुछ ट्रिक्स करें (उदाहरण के लिए, कमी के नाम की संख्या, आदि। इसलिए, क्या आप यह करने के लिए कुछ संकेत दे सकते हैं। ..
nyxee

@nyxee मैं इसे एक नए प्रश्न के रूप में पूछना चाहता हूं, यह इंगित करता है कि आप क्या हासिल करना चाहते हैं।
vog

1
यह एक अच्छा वर्कअराउंड होगा सिवाय 1 के) एप्टिट्यूड अब उबंटू 18.04 और 2 पर डिफ़ॉल्ट रूप से स्थापित नहीं होता है। एप्टीट्यूड में वाइल्डकार्ड को संभालने के लिए एक बहुत अलग (अजीब तरीके से कह सकता है) तरीका है।
जेफ

यह डेबियन 10 पर मेरे लिए काम नहीं कर रहा है। मैं देख रहा हूँ,Couldn't find any package whose name or description matched 'QUX' Unable to apply some actions, aborting
pdoherty926

@ pdoherty926 संकेत के लिए धन्यवाद। मैंने इसे सत्यापित किया और तदनुसार अपना उत्तर समायोजित किया।
vog

0

एक और छोटे 2-लाइनर अगर किसी को उपयुक्त का उपयोग करने की आवश्यकता है:

purge_packages () {
  matchedPackages="$(echo "$(apt list --installed $* 2>/dev/null)" | grep -v '^Listing\.\.\.' | sed -s 's|[/ ].*||' | tr '\n' ' ' | sed 's/ *$//;s/^ *//')"
  [[ -n "$matchedPackages" ]] && apt purge -yq $matchedPackages
}

explination:

apt list --installed $*         # Lists packages matched from function args, the --installed flag limits results to installed packages

2>/dev/null                     # Disregard the warning about using this command in a script

grep -v '^Listing\.\.\.'        # Remove the first line of output that says "Listing..." or "Listing... Done"

sed -s 's|[/ ].*||'             # Remove the rest of the line after the package name (I'm checking for / or space though it looks like just the slash is needed but package names will never have a space)

tr '\n' ' '                     # Put it all on one line separated by spaces

sed 's/ *$//;s/^ *//'           # Remove trailing and leading spaces from the line so it will be blank during the test next line if nothing was matched

[[ -n "$matchedPackages" ]]     # Check if any packages were matched

apt purge -yq $matchedPackages  # Purge them!

SuperUser में आपका स्वागत है! क्या आप अपने उत्तर में अधिक विवरण जोड़ेंगे कि आपकी स्क्रिप्ट क्या करती है, और यह कैसे करती है?
एल: डीएन

@ El8dN8 जोड़ा अन्वेषण
मेयर
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.