是否可以撤消apt-get install命令?


67

我在Xubuntu安装程序(Live USB)上安装了Carpadio,然后从存储库的Ubuntu端像拉了50多个软件包。现在,我想撤消此操作。但是,对于我的所有狩猎活动,我找不到什么比我该如何建议sudo apt get install命令更有用的了apt-get purge。这没有用,因为它所做的只是删除2个软件包(carpadio和carpadio-gnomepanel)。

/var/log/apt/history.log列出了与该命令一起安装的所有软件包。所以我想知道是否有任何简单的方法可以删除所有这些?否则我可以重新安装,无论如何这是一个全新的安装,但我很好奇。

历史记录日志的一小部分(整个列表的1 / 5-1 / 10)

命令行:apt-get install cardapio-gnomepanel
安装:libdbusmenu-qt2:amd64(0.9.2-0ubuntu1,自动),python-packagekit:amd64(0.7.2-4ubuntu3,自动),cups-pk-helper:amd64(0.2.1.2-1ubuntu0.1,自动) ,geoclue:amd64(0.12.0-1ubuntu12,自动),Unity:amd64(5.18.0-0ubuntu1,自动),指示器打印机:amd64(0.1.6-0ubuntu1,自动),libevolution:amd64(3.2.3- 0ubuntu6,自动),libqt4-declarative:amd64(4.8.1-0ubuntu4.3,自动),libmtp9:amd64(1.1.3-1ubuntu0.1,自动),tracker-miner-fs:amd64(0.14.0-2ubuntu1 ,自动),gir1.2-rb-3.0:amd64(2.96-0ubuntu4.2,自动),python-aptdaemon.pkcompat:amd64(0.43 + bzr805-0ubuntu7,自动),gnome-media:amd64(3.4.0- 0ubuntu3.1,自动),metacity:amd64(2.34.1-1ubuntu11,自动),nautilus:amd64(3.4.2-0ubuntu6,自动),libcompizconfig0:amd64(0.9.7.0〜bzr428-0ubuntu6,自动),compiz-插件默认:amd64(0.9.7.12-0ubuntu1,自动),libunistring0:amd64(0.9.3-5,自动),libebackend-1.2-1:amd64(3.2.3-0ubuntu7,自动),ubuntu-docs:amd64(12.04.6 ,自动),python-mako:amd64(0.5.0-1,自动),

对于所有提出建议的人autoremove:我不确定为什么,但是我只有1个其他与python相关的程序包(python-keybinder或其他)为“不必要”,而autoremove可以删除所有这些。

在安装和卸载之间,只有主要的变化是安装xubuntu-restricted-extras


4
在这种情况下提供帮助有点晚了,但是下次您要安装某些东西时,请考虑首先进行仿真。Run sudo apt-get install -s packagewhere -s表示模拟,package将由适当的软件名称代替。

@ vasa1是的,我为此感到不安。apt-get的要求[Y / N]为好,本来应该是我的了..
KARTHIK牛逼

我只有1个其他与python相关的软件包(python-keybinder或summat)为“不必要的”,您实际上删除了该cardapio-gnomepanel软件包吗?
gertvdijk

@gertvdijk是的,apt-get remove carpadio也沿用了那个。
Karthik T

1
@KarthikT然后我完全迷失了为什么autoremove对您不起作用。您要么以某种方式将所有软件包标记为现在手动安装,要么存在明显的误解。这非常简单:apt-get autoremove只需删除所有自动安装的带标记的软件包,而无需立即拥有它们。如果对您不起作用,我认为您已经更改了系统中未在问题中提到的某些内容。
gertvdijk

Answers:


79

基本上,您必须同时apt-get remove打包(或apt-get清除)该软件包在此apt-get autoremove之后运行,以使其恢复的安装package-one

让我们看一下整个过程:

  • sudo apt-get install package-one 安装了50个依赖项,并标记为“自动”,也可以从问题的日志摘录中看到

  • sudo apt-get purge package-one 移除(清洗)只有一个,但做到运行这个!

    以下所有所有安装操作(如果运行任何操作)将产生一条参考消息,其中包含不再需要的软件包:

    The following packages were automatically installed and are no longer required:
      package-two package-three [...]
    Use 'apt-get autoremove' to remove them.
    

    此列表基本上只是标记为“自动”的所有软件包的列表,而对它们没有反向依赖性。换句话说,就软件包管理而言,没有理由安装它们。

    注意:无需安装!只是为了证明APT可以很聪明地告诉您有关不需要的软件包的信息!

  • sudo apt-get autoremove --purge 删除(清除)这些

更多信息


2
在此OP中加入了Unity及其所有朋友。我怀疑即使自动删除后,清除cardapio也会删除Unity等。

@ vasa1为什么?这些软件包被标记为“自动安装”(从问题中可以看出),如果找不到找不到要在系统上安装的软件包的原因,则建议使用删除它们autoremove
gertvdijk

是的,我想知道“自动”功能。如果这样可以表明自动删除是好的。那时OP应该没有问题。

@gertvdijk被@ vasa1抓住了,请看我的编辑。autoremove没有帮助。
Karthik T

@gertvdijk,对于“后续安装操作”是否sudo apt-get update足够?

19

当您要删除当时安装的软件包及其依赖项时,应使用:

sudo apt-get purge package
sudo apt-get --purge autoremove

但是要撤消apt操作,可以使用apt-undo脚本。这是一个简单的脚本,可以撤消apt在Ubuntu中执行的操作。请注意,此脚本仅在您使用它而不是apt-get安装/升级/删除/清除/降级软件包的情况下才可以使用。

apt-undo在Ubuntu中安装,请在终端中运行以下命令:

sudo add-apt-repository ppa:lkjoel/apt-undo
sudo apt-get update
sudo apt-get install apt-undo

用法:

apt-undo install yourpackages
apt-undo remove yourpackages
apt-undo purge yourpackages
apt-undo upgrade
apt-undo dist-upgrade
apt-undo install yourpackages=old.version
apt-undo install yourpackages=new.version

要撤消,上述aptitude操作在终端中运行以下命令:

apt-undo undo

1
谢谢,我遇到了这一点,这听起来像医生嘱咐什么,直到我看到了,我需要用它来安装的警告,才能够撤消..
KARTHIK牛逼

1
不错的收获。但是,语法非常混乱。我真的不喜欢使用经过良好测试的核心APT应用程序的替代方案。还是+1!
gertvdijk

7

使用Unix的功能。以您拥有的日志文件行为基础,并构造一个命令来撤消apt所做的操作。例如:

$ echo 'Install: libdbusmenu-qt2:amd64 (0.9.2-0ubuntu1, automatic), python-packagekit:amd64 (0.7.2-4ubuntu3, automatic), cups-pk-helper:amd64 (0.2.1.2-1ubuntu0.1, automatic),'|perl -pe 's/ \(.*?\)//g; s/,//g; s/^Install: //'
libdbusmenu-qt2:amd64 python-packagekit:amd64 cups-pk-helper:amd64

因此,您可以使用此命令清除日志文件中的相应行,以清除所有意外安装的软件包:

$ dpkg -P $(echo '(full log line here)' | perl -pe 's/ \(.*?\)//g; s/,//g; s/^Install: //')

(我之所以使用perl而不是sed因为sed使用了一种不支持非贪婪匹配的正则表达式类型,这是构造所需内容的最简单方法)


1
不错的脚本,但实际上应该只是人们记得完成它的命令序列。
gertvdijk

谢谢,令人生畏的脚本,但我担心它会归结为这一点
Karthik T

1
我使用非常相似的代码来解决非常相似的问题。我分几个步骤进行操作,只是为了更加确定发生了什么。首先,我将apt日志中的相关文本块复制到一个新文件中,然后将其应用到该文件中:perl -pe 's/\(.*?\)(, )?//g' /path/to/apt-history.log 然后,我所做的只是在输出之前加上了前缀,sudo apt-get remove我非常高兴!
Insperatus

1

删除一个软件包后,可以通过添加--purge,for来彻底删除它apt-get remove --purge <package>,它应该会提示您该软件包引入的库软件包已自动安装并且不再需要,此时您可以运行apt-get autoremove到删除它们。


谢谢,但是在这种情况下autoremove被证明是不够的。请看我的编辑。
Karthik T

1

按照sudo apt-get purge packagename

sudo apt-get autoremove. 

除非它是元包,否则应该照顾它。

另请参阅如何手动删除所有 Cardapio文件的常见问题解答。


谢谢,但是在这种情况下autoremove被证明是不够的。请看我的编辑。谢谢您的FAQ链接,非常有用!
Karthik T

1
这些软件包中的某些可能是其他事物所需要的,并且未标记为能够自动删除。您是否查看了链接上的说明?那些怎么样
chaskes 2013年

链接上的说明与核心问题完全正交,因此,我倾向于重新安装系统。不管怎么说,还是要谢谢你。
Karthik T

1
  1. 将apt日志中不需要的软件包的长长列表粘贴到 new_file.txt
  2. 执行 perl -pe 's/\(.*?\)(, )?//g' /path/to/new_file.txt
  3. 将最后一个命令的输出复制到剪贴板上或首先放置在剪贴板上。
  4. 执行sudo apt-get remove[在此处粘贴剪贴板的内容]

做完了

基本上,我们需要将apt日志中的软件包列表格式化为apt-get可以理解的格式。需要加上括号,中间的单词和逗号,这样才是perl发挥作用的地方。是的,有更好(更有效)的方法-但是我已经做到了,它很容易理解,并且有效。


+1是个人经历和解释,但正如我之前提到的,我已经重置了Live USB
Karthik T

1

要撤消上一次apt的安装,您还可以使用以下命令:

sudo apt purge $(grep "Install:" /var/log/apt/history.log | tail -n 1 | tr " " "\n" | grep ":amd64\|:i386" | tr "\n" " ")

这将从历史记录中捕获最新的apt安装,并清除此处所有已安装的软件包。

您可以创建一个名为aptpurgelastinstall的函数以始终使用它(将代码添加到〜/ .bashrc中):

echo 'aptpurgelastinstall () { sudo apt purge $(grep "Install:" /var/log/apt/history.log | tail -n 1 | tr " " "\n" | grep ":amd64\|:i386" | tr "\n" " ") ; }' >> .bashrc

现在,您只需要在外壳中键入aptpurgelastinstall即可重做上一次安装。


建议的编辑评论做出反应:“(在我注册之前)改进了我自己的帖子。”您可以要求合并您的帐户,请参阅askubuntu.com/help/merging-accounts
Melebius

0

如果您刚刚添加了ppa并想还原,则需要执行以下步骤。当您安装了其他不想卸载的软件包时,了解这可能会失败。我敢肯定这可以通过脚本来完成。我个人认为这应该是apt的一部分,并且应该更好地管理由于依赖关系而安装了哪些软件包以及应用户的要求来安装了哪些软件包。

1)从/etc/apt/sources.list中删除ppa。请记住添加ppa的时间。如果幸运的话,就不必太精确了。

2)列出从安装PPA开始重新安装的内容:cat /var/log/dpkg.log | grep'升级'

3)列出从安装PPA开始要删除的内容:cat /var/log/dpkg.log | grep'安装'

4)从步骤3中删除所有软件包:sudo apt-get remove {步骤3中的软件包列表}

5)重新安装步骤2中的所有软件包:sudo apt-get install --reinstall {步骤2中的软件包列表}

6)如果出了问题并且您想不出解决方案,请放回PPA并重新安装两个列表中的所有软件包。


0

我知道这是一个很老的问题,但是我来这里寻求帮助,也许我可以帮助某人。安装后,我的情况类似于@ Karthik-T的情况unity8-desktop-session-mir。我知道这是一个大问题。它带走了233包。

使用autoremove我只删除了其中的34个。关键是在unity8-desktop-session-mir安装过程中,它删除了两个软件包(python3-aptdaemon.pkcompatevolution-data-server-online-accounts)。它表示在/var/log/apt/history.log,在后Install段。

要完全撤消Unity 8安装,我发出了以下命令:

  1. sudo apt-get purge unity8-desktop-session-mir
  2. sudo apt-get --purge autoremove
  3. sudo apt-get install python3-aptdaemon.pkcompat evolution-data-server-online-accounts (它删除了与Unity 8相关的8个软件包)
  4. sudo apt-get --purge autoremove

这绝对不会删除您之前安装的所有内容,但在某些情况下已经足够。

PS:也许autoremove第二步没有必要,因为我在第四步再次发布。


0

从技术上讲,“删除”或“自动删除”操作不是“撤消”,尽管在大多数情况下可以使它们做得足够好。

默认情况下,除非指定,否则apt-get会留下软件包 -o APT::Suggests-Important=0 -o APT::Recommends-Important=0

查看apt history.log并卸载所有已安装的软件包,是更可靠的方法。我创建了一个基于节点的小型脚本来简化此过程:

https://github.com/rolfen/apt-history

此外,这是另一种更“手动”回滚更改的方法:

https://unix.stackexchange.com/a/236711

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.