完全删除应用程序的正确方法是什么?


545

我在网上搜索了此类信息,并找到了不同的命令行,例如:

sudo apt-get remove application
sudo apt-get remove application*

sudo apt-get remove --purge application
sudo apt-get remove --purge application*

sudo apt-get purge application
sudo apt-get purge application*

那么,正确的方法是什么?是否需要使用“ *”?

之后,我还找到了以下命令:

sudo updatedb
sudo locate application
sudo rm -rf (file/folder name)

1
这篇文章可能会回答您的一些问题:askubuntu.com/questions/1143/how-can-i-uninstall-software
Glutanimate 2012年

8
application*有时可能会产生意想不到的结果-例如,如果当前目录中有一个名为的文件,则application_information在将其传递给apt-get之前,shell会对其进行扩展。如果发生这种情况,并且您确实想要字面上的星号,则可以使用application\*'application*'
Izkata 2012年

6
application*如果当前目录中没有文件,则更加危险:apt-get使用正则表达式,不使用全局模式。人们几乎抹去了整个系统,试图删除它们wine*
Andrea Corbellini 2013年

3
你可以接受答案吗?感谢回答您的人。
m-ric

无论是application*也不application\*是安全的!*用风险报价\' '增加风险,确保*按原样传递给apt-get(尽管无论如何通常如此!),会导致apt-get将参数解释为正则表达式。在正则表达式中*表示“零个或多个前面的字符”。错误的一种常见形式是卸载wine*,删除了所有的包win(不winewin在任何地方以自己的名字,并根据其中的任何所有软件包。请参阅此说明可能的修复程序。@Izkata
Kagan

Answers:


704
  • apt-get remove packagename

    将删除二进制文件,但不删除软件包的配置文件或数据文件packagename。在安装时间不变的情况下,它还将使安装的依赖项保持不变。

  • apt-get purge packagename 要么 apt-get remove --purge packagename

    会删除与该软件包有关的所有内容packagename,但不会删除与安装时一起安装的依赖项。这两个命令是等效的。

    当您想从一个应用程序“重新开始”时特别有用,因为您弄乱了配置。但是,它不会删除驻留在用户主目录中的配置或数据文件,这些文件通常位于该目录的隐藏文件夹中。也没有简单的方法来删除这些。

  • apt-get autoremove

    删除孤立的软件包,即曾经作为依赖安装但不再存在的已安装软件包。在删除已安装不再需要的依赖项的软件包后,使用此方法。

  • aptitude remove packagenameaptitude purge packagename(同样)

    也将尝试删除packagenameon 所需但其余任何软件包都不需要的其他软件包。请注意,它aptitude仅记住已安装软件包的依赖项信息。

还有更多。dpkg可以使用(高级)较低级的命令,或者使用诸如Muon,Synaptic,软件中心等GUI工具。没有唯一的“正确方法”来删除应用程序或执行与包管理交互的其他任务。

您找到的列表仅是示例。在接受该动作之前,请确保您理解其含义并尝试执行该动作(Y在实际执行建议的动作之前,需要先按一下它)。

问题中的星号版本可能是错误的 ; apt-get接受一个正则表达式而不是glob模式作为外壳。那会发生什么

sudo apt-get remove application*

是以下内容:

  1. Shell尝试扩展以application*查看当前目录中的文件。如果(通常情况下)什么也没找到,它将返回原样的glob模式(假设bash这里的默认行为--- zsh将出错)。

  2. apt-get将删除其名称的包包含一个字符串满足正则表达式application*,即,applicatio其次是任意数量的napplicatioapplicationapplicationnlibapplicatio,等。

  3. 要了解这有何危险,请尝试(不使用root进行双重安全保护)apt-get -s remove "wine*"-s将模拟该事情而不是这样做)---它将删除所有名称和受抚养人中带有“ win”字样的软件包,几乎整个系统...

可能是因为该命令确实是

 sudo apt-get remove "^application.*"

(请注意引号和圆点),这将删除名称以开头的所有软件包application

这些命令

sudo updatedb                  # <-- updates the locate database (index). harmless
sudo locate application        # <-- locates the file 'application'. harmless
sudo rm -rf (file/folder name) # <-- removes files/dirs recursively. dangerous.

完全不在包管理的范围之内。在不使用软件包管理器的情况下,请勿删除属于软件包的文件!它将变得混乱,并且是做事的错误方法。

如果您不知道文件属于哪个包,请尝试以下操作:

dpkg -S /path/to/file

9
当尝试完全删除所有剩余的依赖关系(包括其配置文件)时,--purge选项也很方便:apt-get-autoremove --purge 还应注意,主目录中的配置文件不受--purge选项的影响。这些您将必须手动删除。
谷氨酰胺

1
这里有一个错误:apt-get接受RE,而不是glob;因此apt-get remove pack *将删除所有以pac开头,后跟零个或多个k ...的软件包...这通常是意外的。我编辑了分析器。又见askubuntu.com/questions/210976/...
Rmano

我认为这个答案不再准确。无论apt remove -s texlive*或其apt-get对应的回线,如Note, selecting 'texlive-font-utils' for glob 'texlive*'(这意味着他们的确接受水珠),其次是平常Package 'texlive-common' is not installed, so not removed,终于Remv线,如Remv texlive-font-utils [2015.20160320-1] [...]
Jonathan Y.

@乔纳森 您还将选择未安装的软件包。无论如何,能否请您提出一个新问题,并详细说明您在该问题中的情况。我很乐意看看:)
gertvdijk

我不是在问一个新问题。我指的是可能的更改,因为做出此答案会使某些细节不正确。看起来,apt-get remove packa*确实确实需要使用glob,packa*而不是将其视为正则表达式:它匹配package但不匹配pack
Jonathan Y.

109

对于Ubuntu 12.04或更高版本,正确的方法是:

sudo apt-get --purge autoremove packagename

这里详细介绍。

请勿使用,packagename*因为这可能会删除意想不到的软件包并导致更多问题,而这超出了其解决的范围。或者,如果你必须至少有一个运行它-s--simulate--dry-run旗先来看看到底是什么会不这样做事情。


13
这是正确的答案,简洁明了:
Anwar

20

您可以使用以下命令:

sudo apt-get purge --auto-remove packagename

它将清除必需的软件包以及与这些软件包一起安装的依赖项。该--auto-remove选项(是的别名autoremove)的作品相似sudo apt-get autoremove。通过使用此命令,我们可以运行一个命令:

sudo apt-get purge --auto-remove packagename

代替:

sudo apt-get purge packagename
sudo apt-get autoremove

2
尽管您是正确的,但也可以使用sudo apt-get --purge autoremove packagename。同1个命令这里
安瓦尔

完整命令也可以写成apt-get autoremove --purge代替apt-get purge --auto-remove吗?
felwithe

3
有人可以枪杀我吗?
马丁·安德森

7

您可以安全地使用sudo apt-get remove --purge applicationsudo apt-get remove applications99%的时间。当您使用purge标志时,它也会简单地删除所有配置文件。您可能想要或不想要哪个,取决于您是否要重新安装所述应用程序。在application*将匹配以启动所有的应用程序application通常是插件,附加功能等要删除的主要应用。即

sudo apt-get remove gedit*

将删除geditgedit-plugins并且gedit-common。通常不需要这样做,因为大多数插件/关联程序都依赖于主应用程序,并且在卸载主应用程序时会自动删除(或标记为删除)。

您的最后一条命令仅是从已知具有混乱的卸载程序的应用程序中删除残留的内容,并且仅删除该应用程序的所有残余内容。


5

我收到一些删除软件包的错误消息,发现有效的唯一方法是:

mv /var/lib/dpkg/info/package.* /tmp/
dpkg --remove --force-remove-reinstreq package

我发现虽然只使用

dpkg --remove --force-remove-reinstreq package

不会删除软件包,它向我显示了要移动的文件的正确路径:

mv /var/lib/dpkg/info/package.* /tmp/

用您的应用程序名称替换软件包。在Ubuntu中使用sudo,在Debian中成为root。



1

这取决于您要删除的应用程序。在发出yes命令之前,请务必确保检查其依赖性。当您通过命令行删除某些内容时,有时会显示一些不再需要的库。这些可以通过apt-get autoremove删除。

请注意,通过使用诸如sudo apt-get remove --purge applicationname之类的命令,可能会删除其他应用程序所需的某些依赖项,因此可能会破坏系统。

如果您想以更安全的方式进行操作,则始终可以仅使用软件中心将其删除,也可以使用apt-get remove applicationname进行删除。如果不再需要依赖项,请稍后发布apt-get autoremove。


我认为整个Debian软件包系统是专门为在没有其他依赖软件包的软件包删除软件包的情况下设计的。你可能会(有益),询问是否要删除所有依赖包过了,那是你应该实际阅读包大约要删除的名单,这是我认为你是想说。
Xen2050 2015年

1

我只是想澄清一件事,这似乎引起了混乱。该dpkg实用程序不了解彼此之间的包依赖性,也无法跟踪它们之间的依赖关系,这是apt我相信开发的一个重要原因。您可以在此页面上 8.6节中阅读有关此内容的信息。Debian GNU / Linux FAQ-Debian软件包管理工具

  • 使用apt:如果我想清除程序包A,并且它具有一个称为程序包B的依赖项,而程序包B没有其他依赖程序包,则将清除程序包A和B。如果软件包B DID具有其他从属软件包,则仅清除软件包A。

  • 使用dpkg:什么依赖性?您只是告诉我清除该死的
    包裹,所以我就是这样做的!您方面的不良计划并不意味着
    我方面的紧急情况。

话虽如此,这里有两种单衬管可用于每种吹扫方法:

dpkg --list |grep "^rc" | cut -d " " -f 3 | xargs sudo dpkg --dry-run --purge

apt-get autoremove -y; apt-get --dry-run purge -y $(dpkg --list |grep '^rc' |awk '{print $2}')

删除--dry-run以执行实际的清除操作,而不是报告将执行的操作。

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.