各种 APT 包删除命令有何不同?

saj*_*jad 17 package-management uninstall apt purge

这些命令有什么区别?

  1. sudo apt-get autoremove --purge packagenames
  2. sudo apt-get remove --purge packagenames
  3. sudo apt-get purge purge packagenmaes
  4. sudo apt-get remove packagenames
  5. sudo apt-get autoremove

Eli*_*gan 24

快速回答

  • remove 卸载以它命名的软件包。
  • autoremove卸载所有不再需要的自动安装的软件包。在autoremove;之后列出包名是不正确的 它们将被忽略(并且所有符合条件的包都将被删除),这可能不是您想要的。
  • --purge导致与被删除的包相关的系统范围的配置文件也被删除。它必须伴随一个命令,例如removeautoremove。该--purge标志修改命令的动作;它不会自行行动。
  • purge表示与--purge remove(与 相同remove --purge)的意思。说purge两次是错误的;第二个purge被解释为要成为purged的包的名称,这可能不是您想要的。

完整答案

要了解这些命令的作用以及它们有何不同,了解两个概念会有所帮助(甚至可能是必不可少的):

  1. 手动安装包和自动安装包的区别
  2. 一个包的包文件和它的配置文件的区别

手动安装与自动安装

已安装的软件包可以手动自动安装。

当您指定安装包并安装时,它是手动安装的。

但也可以安装其他软件包。大多数包都有依赖项——必须安装其他包,这些包才能按预期工作。当你安装一个包时,它的依赖项(即它所依赖的其他包)被安装,除了之前安装的那些。

当您没有指定要安装的软件包,而是作为您指定要安装的软件包的依赖项安装时,它会自动安装。

请注意,当您安装了两个软件包并且其中一个是另一个的依赖项时,这并不意味着该依赖项会自动安装。依赖项也可能是手动安装的(即,由您指定,例如,在依赖它的包之前或同时安装)。

最后:

  • 如果您尝试手动安装已安装的软件包,它仍会保持安装状态。但是如果它是自动安装的,则会进行更改——尝试手动安装它会将其标记为手动安装。
  • 您可以将任何包标记为手动或自动安装(使用apt-mark命令),无论它们是如何或在什么情况下实际安装的。
  • Ubuntu 系统预装的软件包不会全部自动安装;其中一些标记为自动安装,其他标记为手动安装。这是为了满足区分手动安装和自动安装的软件包背后的逻辑——某些软件包只需要为其他软件包服务的想法。

通常,对于每个自动安装的包,您将至少有一个依赖于它的手动安装的包(并导致它被自动安装)。但是,如果您随后删除了所有依赖于自动安装的软件包的手动安装的软件包,则自动安装的软件包将不再是必需的,但仍会被安装。

apt-get autoremove 删除不再有任何依赖它们手动安装的软件包的自动安装的软件包。

包文件和配置文件

包提供的文件旨在并在安装了该版本包的每个系统上保持相同。此类文件为已安装的程序提供可执行文件、资源、文档和其他“资产”。我们通常将这些称为包提供的“文件”。

但是一个包也提供了其他文件,这些文件可能(可能)被更改。这些称为全局(或系统范围)配置文件。它们几乎总是安装在/etc目录中,并且可以自动和手动修改它们以更改已安装程序的行为。例如,sudo有一个配置文件/etc/sudoers,以及一个存放更多配置文件的目录/etc/sudoers.d。该文件以及添加到该目录中的任何文件指定了允许谁sudo以何种方式使用。

通常,希望卸载软件包然后重新安装它不应改变它的行为方式(除非它的软件包文件已损坏并且这就是您重新安装它的原因,当然)。因此,通常当一个包被卸载时,它的包文件被删除,但它的系统范围的配置文件保持不变。

当您卸载一个包而没有指定它的系统范围的配置文件也应该被删除时,这称为“删除”包。

如果您还想在卸载软件包时删除软件包的系统范围配置文件,这称为“清除”软件包。

apt-get remove将删除一个包;也就是说,它将卸载软件包但保留其系统范围的配置文件。

apt-get purge将清除一个包;也就是说,它将卸载软件包并确保删除其系统范围的配置文件。

清除包的另一种方法是使用--purge标志。这并不能说明apt-get该做什么;相反,它修改了命令remove它执行的术语(或“命令”)。该--purge标志导致任何软件包卸载伴随着被卸载软件包的系统范围配置文件的删除。换句话说,该--purge标志将移除变为清除。

--purge当我们有purge命令时,为什么我们有标志?毕竟,不sudo apt-get --purge remove packagename等同于sudo apt-get purge packagename. 它们是等价的。其中--purge,当要修改命令的行为就派上用场了就是其他remove

例如,假设您要卸载不再需要的自动安装的软件包(因为不再有任何手动安装的软件包依赖它们),但您不仅想删除这些自动安装的软件包,还想删除他们的系统范围的配置文件。然后你可以运行:

sudo apt-get --purge autoremove
Run Code Online (Sandbox Code Playgroud)

让我们考虑另一种用法--purge。有一个名为 的标志--reinstall,它将安装转换为重新安装。这就是说,通常情况下,当您尝试安装已安装的软件包时,不会发生任何事情,或者(如果该软件包标记为自动安装)该软件包将被标记为手动安装。但是有了这个--reinstall标志,安装一个已经安装的包会导致它被删除然后重新安装

sudo apt-get --reinstall install packagename
Run Code Online (Sandbox Code Playgroud)

但是假设您要删除正在重新安装的软件包的系统范围的配置文件。这有点常见;当一个包不工作并且您不知道为什么时,您可以尝试重新安装它,并删除它的配置文件,以便将其配置重置为默认值。为此,您可以运行:

sudo apt-get --purge --reinstall install packagename
Run Code Online (Sandbox Code Playgroud)

--reinstall匝数安装到重新安装(即,去除依次安装),并且--purge接通重新安装的去除部进入吹扫。

你的例子的行为

现在应该清楚每个示例apt-get命令的作用:

  • sudo apt-get autoremove --purge packagenames

    这会清除不再有任何依赖于它们的手动安装的软件包的自动安装的软件包。也就是说,它会卸载这些包(这需要删除它们的包文件),并且它也会删除它们的系统范围的配置文件。

    在这里,packagenames什么都不做。特别是,如果您只想删除名称列在那里的包,那么这将不会按您的意愿运行。

  • sudo apt-get remove --purge packagenames

    这清除packagenames; 假设packagenames是一个以空格分隔的包名称列表,它将清除所有这些名称。也就是说,它将卸载它们(这需要删除它们的包文件),并且还会删除它们的系统范围的配置文件。

    如果packagenames未安装 中列出的任何软件包,则其在列表中的存在将不起作用(除非您将被告知它未安装)。如果您列出的包名称不是任何实际包的名称,则该命令将失败并显示错误。unable to locate packagename

  • sudo apt-get purge purge packagenmaes

    如果您删除purge了该命令中出现的一个,它将等同于前一个。就目前而言,它尝试清除名为 的包purge,并清除 中列出的包packagenames。由于purge不是任何包的名称,它会失败并显示错误消息。

  • sudo apt-get remove packagenames

    这将删除 中列出的包packagenames,这需要删除它们的包文件。这不会删除其系统范围的配置文件(因为它只是删除,而不是清除)。

  • sudo apt-get autoremove

    这将卸载不再有任何依赖于它们的手动安装的软件包的自动安装的软件包。这需要删除它们的包文件,而不是它们的系统范围的配置文件(也就是说,它是删除而不是清除)。

有关如何使用的更多信息apt-get,我推荐它的手册页。有关更多一般信息,请参阅本指南