问题描述
我在我的Xubuntu安装(一个Live USB)上安装了Carpadio,然后从我认为的存储库的Ubuntu端提取超过50个包。现在我想撤消这个。然而,对于我的所有狩猎,我找不到比How can I reverse sudo apt get install command更有用的东西,它只是建议apt-get purge
。这没用,因为它只需删除2个包(carpadio和carpadio-gnomepanel)。
/var/log/apt/history.log
包含随该命令一起安装的所有软件包的列表。所以我想知道是否有任何简单的方法去除所有这些?否则我可以重新安装,无论如何这是一个全新安装,但我很好奇。
历史日志的一小部分样本(整个列表的1 /5-1 /10)
Commandline: apt-get install cardapio-gnomepanel
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), geoclue:amd64 (0.12.0-1ubuntu12, automatic), unity:amd64 (5.18.0-0ubuntu1, automatic), indicator-printers:amd64 (0.1.6-0ubuntu1, automatic), libevolution:amd64 (3.2.3-0ubuntu6, automatic), libqt4-declarative:amd64 (4.8.1-0ubuntu4.3, automatic), libmtp9:amd64 (1.1.3-1ubuntu0.1, automatic), tracker-miner-fs:amd64 (0.14.0-2ubuntu1, automatic), gir1.2-rb-3.0:amd64 (2.96-0ubuntu4.2, automatic), python-aptdaemon.pkcompat:amd64 (0.43+bzr805-0ubuntu7, automatic), gnome-media:amd64 (3.4.0-0ubuntu3.1, automatic), metacity:amd64 (2.34.1-1ubuntu11, automatic), nautilus:amd64 (3.4.2-0ubuntu6, automatic), libcompizconfig0:amd64 (0.9.7.0~bzr428-0ubuntu6, automatic), compiz-plugins-default:amd64 (0.9.7.12-0ubuntu1, automatic), libunistring0:amd64 (0.9.3-5, automatic), libebackend-1.2-1:amd64 (3.2.3-0ubuntu7, automatic), ubuntu-docs:amd64 (12.04.6, automatic), python-mako:amd64 (0.5.0-1, automatic),
对于所有建议autoremove
的人:我不知道为什么,但我得到了另外一个与python相关的包(python-keybinder或其他)作为”unnecessary”,这就是autoremove能够删除的全部内容。
在安装和卸载之间,只有重大更改是安装xubuntu-restricted-extras
。
最佳解决方案
基本上,您必须同时使用apt-get remove
(或apt-get清除)包并运行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.
这个列表基本上只是标记为”automatic”的所有包的列表,没有对它们的反向依赖。换句话说,就包管理而言,没有理由安装它们。
注意:无需安装!这只是为了证明APT很聪明地告诉你你不需要的包裹!
-
sudo apt-get autoremove --purge
去除(清除)这些
更多信息
-
apt-get(8)
联机帮助页上有关autoremove
的官方文档: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的强大功能。获取您拥有的日志文件行,并构造一个命令,以撤消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
使用的是一种不支持non-greedy匹配的正则表达式,这是构建我需要的最简单的方法)
参考资料