Ігноруйте пакети, які наразі не встановлені під час використання "apt-get remove"


15

У мене є сценарій, коли я хотів би видалити набір пакетів, які можуть бути встановлені або не можуть бути встановлені, і я хотів би apt-get видалити ті, що є, і мовчки ігнорувати ті, які не є. Щось на зразок:

apt-get remove foo bar baz

які, якби foo і bar були встановлені, але baz не було, видалили б foo and bar, не скаржившись на baz. Чи є спосіб це зробити?

Те, що я спробував, не спрацювало, з cup-dbg як моїм козлом відпущеного фактично встановленого пакета, який потрібно видалити:

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магії, але я хотів би уникнути будь-якої складності, яка не є абсолютно необхідною.


Ця відповідь спрацювала для мене врешті-решт. Німе виправлення за тупу проблему. Зауважте, що на Launchpad насправді є дефект, тому не соромтесь робити внесок.
Джефф

Відповіді:


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, але я прийму вашу відповідь, оскільки, схоже, немає кращого способу зробити це.
javawizard

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

Для Debian ≤ 9 можна просто використовувати aptitudeзамість apt-get:

sudo aptitude remove -y cups-dbg bogus-package

Aptitude друкує попередження, але продовжує видаляти ваші пакунки:

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) здатність більше не встановлюється за замовчуванням на Ubuntu 18.04 та 2) у здатності є досить інший (можна сказати, дивний) спосіб поводження з підстановкою.
Jeff

Це не працює для мене на Debian 10. Я бачу,Couldn't find any package whose name or description matched 'QUX' Unable to apply some actions, aborting
pdoherty926

@ pdoherty926 Дякую за підказку. Я перевірив це і відповідно відкоригував свою відповідь.
vog

0

Ще один маленький 2-лайнер, якщо комусь потрібно використовувати apt:

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
}

Роз'яснення:

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

@ El8dN8 Додано роз'яснення
Meir
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.