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

我在我的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,自动),统一: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- plugins-default: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 :我不知道为什么,但我只有一个其他python相关的包(python-keybinder或其他东西)作为“不必要的”,这就是autoremove能够删除的全部内容。

在安装和卸载之间,只有重大更改是安装xubuntu-restricted-extras

基本上,你必须同时apt-get remove (或apt-get purge)包, 然后运行apt-get autoremove ,让它恢复package-one的安装。

让我们看看整个过程:

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

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

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

    注意:无需安装! 这只是为了certificateAPT很聪明地告诉你你不需要的包裹!

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

更多信息

  • 有关自动autoremove官方文档,请autoremove apt-get(8)联机帮助页:

    autoremove用于删除自动安装的包以满足其他包的依赖关系,现在不再需要。

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

如果要删除当时安装的包及其依赖项,则应使用:

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

但要撤消apt操作,可以使用apt-undo脚本。 这是一个简单的脚本,可以撤消在Ubuntu中执行的apt操作。 需要注意的是,只有在使用它而不是apt-get来安装/升级/删除/清除/降级软件包时,此脚本才能工作。

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

 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 

使用Unix的强大function。 获取您拥有的日志文件行,并构造一个命令,以撤消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使用了一种不支持非贪婪匹配的正则表达式,这是构建我需要的最简单的方法)

删除一个软件包后,您可以通过添加–purge,for, apt-get remove --purge 彻底删除它,它应该会显示一条消息,即它所apt-get remove --purge 的库软件包是自动安装的,而不是更长的必要时间,此时你可以运行apt-get autoremove来删除它们。

请使用sudo apt-get purge packagename

 sudo apt-get autoremove. 

除非它是元数据包,否则应该处理它。

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

  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进入的地方。 是的,有更好(更有效)的方式 – 但我已经做到了,它易于理解,而且有效。

如果您刚刚添加了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’install’

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

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

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

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

使用autoremove我只删除其中的34个。 关键是在unity8-desktop-session-mir安装期间,它删除了两个软件包( python3-aptdaemon.pkcompatevolution-data-server-online-accounts )。 在Install部分后面的/var/log/apt/history.log说明了这一点。

要完全撤消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 (删除了8个与Unity 8相关的软件包)
  4. sudo apt-get --purge autoremove

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

PS:也许第二步的autoremove是没有必要的,正如我在第四步再次发出的那样。

从技术上讲,“删除”或“自动移动”操作不会“撤消”,尽管它们可以在大多数时间内完成这项工作。

默认情况下,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