13

У меня есть сценарий, в котором я хотел бы удалить набор пакетов, которые могут или не могут быть установлены, и я хотел бы, чтобы apt-get удалил те, которые есть, и молча проигнорировал те, которые не были. Что-то вроде:

apt-get remove foo bar baz

который, если бы foo и bar были установлены, но baz не был установлен, удалил бы foo и bar без жалоб на baz. Есть ли способ сделать это?

Вещи, которые я пробовал, которые не работали, с cups-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 , но я бы хотел избежать любой сложности, которая не является абсолютно необходимой.

3 ответа3

7

Я использую apt-get remove --purge (aka 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
7

Является ли вариант возврата к инструменту более низкого уровня, такому как 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 ...

Для удаления пакетов конфигурационных файлов используйте purge, как показано ниже

dpkg --purge foo bar libperl-dev
3

Просто используйте 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}')

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .