我在 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,自动)、indicator-printers: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
:我不确定为什么,但我只得到了 1 个其他 python 相关包(python-keybinder 或类似的包)作为“不必要的”,而这就是 autoremove 能够删除的全部。
在安装和卸载之间,唯一的主要变化是安装xubuntu-restricted-extras
。
答案1
基本上,你必须同时apt-get remove
(或 apt-get purge)这两个包和之后运行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
删除(清除)这些
更多信息
autoremove
来自手册页的官方文档apt-get(8)
:autoremove
用于删除那些为了满足其他软件包的依赖关系而自动安装但现在不再需要的软件包。
答案2
当你想要删除当时安装的包及其依赖项时,你应该使用:
sudo apt-get purge package
sudo apt-get --purge autoremove
但要撤消apt
操作,您可以使用apt-undo
脚本。这是一个简单的脚本,可以撤消apt
在 Ubuntu 中执行的操作。需要注意的是,此脚本仅在您使用它来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
答案3
利用 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
使用了一种不支持非贪婪匹配的正则表达式,这是构建我需要的最简单的方法)
答案4
- 将 apt 日志 (var/log/apt/history.log) 中不需要的软件包的长列表粘贴到
new_file.txt
- 执行
perl -pe 's/\(.*?\)(, )?//g' /path/to/new_file.txt
- 将最后一个命令的输出复制到剪贴板或首先把它放到那里。
- 执行
sudo apt-get remove
[将剪贴板的内容粘贴到这里]
完毕。
基本上,我们需要将 apt 日志中的软件包列表格式化为 apt-get 可以理解的内容。括号、中间的单词和逗号都需要删除,因此这就是 perl 发挥作用的地方。是的,有更好(更高效)的方法 - 但我已经这样做了,它很容易理解,而且有效。