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


13

我有一个场景,我想删除一组可能安装或可能没有安装的软件包,我希望apt-get删除那些那些并且默默地忽略那些不包含的软件包。就像是:

apt-get remove foo bar baz

如果安装了foo和bar但baz没有安装,那么就会删除foo和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

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


这个答案最终对我有用。愚蠢地解决了一个愚蠢的问题。请注意,Launchpad上确实存在缺陷,因此请随时提供帮助。
杰夫

Answers:


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 ...

要删除包配置文件,请使用如下所示的清除

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

只需使用aptitude而不是apt-get

sudo aptitude remove -y cups-dbg bogus-package

能力打印警告,但仍继续删除您的包:

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 2017年

@nyxee我建议将这个问题作为一个新问题,指出你想要实现的目标。
vog

1
这将是一个很好的解决方法,除了1)默认情况下不再在Ubuntu 18.04上安装aptitude 2)aptitude有一个非常不同(可以说是奇怪的)处理通配符的方法。
杰夫
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.