如何完全删除一个软件包?

我正在尝试进行octave3.2软件包的全新安装。
为了做到这一点,我先将其删除,然后尝试重新安装。
重新安装时出现了一个错误。可能是软件包中的一个错误,但我想确保我已经将所有内容都删除,以便能够进行全新安装。
这样做就足够了吗?
sudo apt-get --purge remove octave3.2

可以重新安装软件包,并注意软件包或依赖项列表。 - user309924
1推荐访问这个链接 - Pandya
也许这篇帖子关于手动删除 MS Teams 提供了一些灵感。 - Mat D.
10个回答

这是一个关于清除软件包影响的非常普遍的回答。针对您的具体情况,您需要编辑您的问题并提供额外的信息,特别是您收到的错误消息的完整和准确文本。
使用sudo apt purge ...sudo apt --purge remove ...命令将删除软件包及其所有全局(即系统范围内)配置文件。这通常是人们所说的完全删除软件包的意思。
但这并不意味着您的系统与安装软件包之前完全相同。特别是:
  • 这不会删除作为依赖项安装的软件包,当您要删除的软件包是安装的依赖项时。假设这些软件包不是其他软件包的依赖项,并且您没有将它们标记为手动安装,您可以使用sudo apt autoremove命令来删除这些依赖项,或者(如果您想同时删除它们的系统范围配置文件)使用sudo apt --purge autoremove命令。

  • 这不会删除非系统范围的配置文件。具体而言,它不会删除用户特定的配置:

    • 它不会删除位于用户主目录中(或其主目录的.config子目录中)由软件提供的配置文件和目录。

      • 如果这些文件/文件夹未存储在.config中,它们通常以.开头。无论如何,您可以使用ls命令并使用-a-A标志来查看它们,您还可以在Nautilus和大多数其他文件浏览器/管理器中按下Ctrl+H或转到View > Show Hidden Files来查看它们。
    • 它不会撤销对现有用户特定配置文件所做的更改。

    • 它不会删除新的gconfdconf键,也不会撤销任何gconfdconf配置更改。

  • 使用purge--purge remove而不是remove不会撤销其他软件包提供的现有系统范围配置文件或用户手动创建的配置文件的更改。然而,有时通过卸载软件包(无论是purge还是remove)可以撤消此类更改。


在执行dpkg -l linux-image*命令后,我仍然可以看到大量处于“un”状态的图像。这是一个示例行:“un linux-image-5.11.0-27-generic <none> <none> (no description available)”。我的/boot空间不足,不确定这些列表是否仍占用空间。尝试释放一些空间并没有取得太多进展。 - Kemin Zhou

使用以下命令:

sudo apt-get purge --auto-remove packagename

它将清除与这些软件包一起安装的依赖项。 --auto-remove 选项类似于 sudo apt-get autoremove

1这解决了我的问题,尤其是在使用certbot时。 - T.Todua
救命稻草...在卸载MySQL后,我安装Mariadb遇到了麻烦...清除操作非常顺利。 - Clain Dsilva
你害我了!这个卸载程序把所有东西都删掉了!!! - Spar
@Spar 这是一件好事还是你在说它引起了问题? - intrigued_66

首先,您需要查找要删除的软件包的名称:

dpkg --list

然后,删除给定的软件包:

sudo apt-get remove package_name

清除任何相关代码:

sudo apt-get purge package_name

接着进行自动清理:

sudo apt-get autoremove

最后,进行一次清理以确保所有内容都已正确删除:

sudo apt-get clean

您可以在软件包列表中检查是否不再列出要删除的软件包,但这是可选的。

祝您拥有愉快的一天!


这个和@pl_rock的回答有什么区别? - starriet
2这个答案更清晰且分步详细。 - Muhammad Tariq

1. 移除一个软件包:

获取软件包的完整名称:

dpkg --list | grep partial_package_name*

移除该软件包:
sudo apt-get remove package_name

删除所有的依赖项:
sudo apt-get purge package_name

删除曾经作为依赖项安装的不需要的软件包:

sudo apt-get autoremove

从本地缓存中删除已检索的软件包:
sudo apt-get autoclean

检查是否完全删除:
dpkg --list | grep partial_package_name*

2. 删除一个快照:

使用删除命令:

sudo snap remove package_name

在安装软件时,最好注意额外的依赖包,并及时进行记录。
The following extra packages will be installed: 
    libgssglue1 libnfsidmap2 libtirpc1 nfs-common rpcbind

如果你只删除原始包,依赖包可能会保留下来。
所以你必须手动删除每一个使用的。
apt-get purge package_name

1如果我的控制台无法向上滚动足够远,我该如何获取这些软件包的列表? - Luke Taylor
1@LukeTaylor apt-get install package_name > output
然后使用 less output 来查看所有输出并进行滚动浏览。
- Harikrishnan

如果您想删除某些特定的软件包,可以使用以下命令:

dpkg --get-selections | grep PACKAGE_NAME | awk '{ print $1}'| xargs apt-get -y --purge autoremove

不要忘记使用“-y”开关,否则apt-get会一直询问是否删除单个软件包,并且不会删除任何东西。

2这可能很有用,但也可能具有破坏性:它可能会轻易匹配到你并不真正想要删除的软件包,并在没有确认的情况下删除其配置!幸运的是,由于软件包名称从不包含空格,我们可以改变策略并去掉-y选项:apt-get --purge autoremove $(dpkg --get-selections | grep PACKAGE_NAME | awk '{ print $1}')。这样会相对安全一些。 - joeytwiddle
可能更安全的做法是先运行以下命令:dpkg --get-selections | grep PACKAGE_NAME | awk '{ print $1}'然后再使用xargs运行,这样用户可以看到命令执行后将会删除哪些内容。 - Kerem Ersoy

不要手动删除自动安装的依赖包,而是使用以下命令:

 zanfilip@zanfilip-VPCEB3L0E:~/jp/eclipse$ sudo apt-get --purge autoremove
    正在读取软件包列表... 完成
    正在构建依赖关系树       
    正在读取状态信息... 完成
    将卸载以下软件包
      libupstart1* linux-headers-3.16.0-30* linux-headers-3.16.0-30-generic*
      linux-image-3.16.0-30-generic* linux-image-extra-3.16.0-30-generic*
    0 个软件包升级,0 个新安装,5 个将被卸载,23 个未升级。
    执行此操作后,将释放 279 MB 的磁盘空间。
    是否继续?[Y/n] 


另一个选择是使用debfoster软件包。它将交互式地查找并建议需要删除(和清除)的软件包,以及相关的依赖软件包。
sudo apt install debfoster
sudo debfoster
# and optionally remove debfoster too
sudo purge debfoster

在卸载软件包之前,您必须首先找到确切的软件包名称。要获取系统上所有已安装软件包的列表,请键入:
sudo apt list --installed

要移除已安装的软件包,请运行以下命令:
sudo apt remove package_name

如果你正在使用snap,你可以使用以下命令来移除一个软件包:
$ sudo snap remove <package>

应用程序代码、其运行时依赖项和相关用户数据都已清理完毕。如果您的快照声明了一个服务,它们也将被关闭并移除。