使用“apt-get remove”时忽略当前未安装的软件包

使用“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

我知道我可以使用 shell 脚本和一些dpkg --list魔法来做到这一点,但我想避免任何不必要的复杂性。

答案1

正在回退到较低级别的工具,例如软件包一个选项?

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

答案2

我使用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

aptitude对于Debian ≤ 9,可以使用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}')

答案4

您可以使用dpkg获取已安装的软件包(基于您的列表),将它们存储在变量中,然后使用aptand/or删除它们dpkg。我自己也遇到过这种情况,效果很好!

PKG_LIST="Put packages here space delimited and it will support globbing like this* "
PKG_TO_REM=$(dpkg --get-selections $PKG_INIT 2>/dev/null | awk '{print $1}')

apt-get remove --purge -y $PKG_REM
dpkg --purge $PKG_REM

您可以向dpkg语法添加其他选项来删除“已解压”的包、处理依赖关系等。

为了进行测试,请尝试以下操作来模拟清除包列表:

PKG_LIST="Put packages here space delimited and it will support globbing like this* "
PKG_TO_REM=$(dpkg --get-selections $PKG_INIT 2>/dev/null | awk '{print $1}')

dpkg --dry-run --purge $PKG_REM

相关内容