Игнорировать пакеты, которые в данный момент не установлены, при использовании "apt-get remove"
У меня есть сценарий, в котором я хотел бы удалить набор пакетов, которые могут или не могут быть установлены, и я хотел бы, чтобы 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 ответа
Является ли вариант возврата к инструменту более низкого уровня, такому как 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
Я использую 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
Просто используйте 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}')
Еще один маленький 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
}
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!