我有一个场景,我想删除一组可能已安装或未安装的软件包,并且希望 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
获取已安装的软件包(基于您的列表),将它们存储在变量中,然后使用apt
and/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