如何从Ubuntu 64位系统中删除所有i386软件包?

随着时间的推移,我安装了许多不再需要的i386软件包。我该如何清理系统并只保留amd64软件包?

2http://askubuntu.com/questions/66875/how-to-disable-multiarch-support - Vitaliy Kulikov
6个回答

其他的自动化解决方案有时候是危险的,而且并不总是有效的(1),所以这里提供另一种方法。
sudo aptitude purge `dpkg --get-selections | grep ":i386" | awk '{print $1}'`

或者

sudo apt-get purge `dpkg --get-selections | grep ":i386" | awk '{print $1}'`

(尽量始终只使用其中一种工具。由于aptitude在处理依赖问题时更好,我更倾向于使用它。)
(这也是个好主意)
dpkg --remove-architecture i386

也许
dpkg --print-foreign-architectures

(1) 其他命令也会列出只有 i386 在名称中的软件包(尽管它们是针对 64 位架构的),正则表达式无法工作,并且 dpkg 显示已经删除但仍然有配置文件剩余的软件包(dpkg -l 显示状态为 "rc" 而不是 "ii")。

1既然你已经在使用awk,也可以将grep调用去掉。此外,最好使用$()代替反引号。我刚刚根据你给出的命令,使用了下面的命令来卸载我的i386软件包:sudo apt purge $(dpkg --get-selections | awk '$1 ~ /:i386$/ { print $1 }') - scy
能力一切正常。 - Sohan Arafat
1即使您为amd64架构安装了Steam客户端,这也会导致其崩溃,因为它仍然会安装一些32位文件和库以确保与旧游戏的兼容性。 - Gri Ma

我像这样快速处理了所有的32位软件包:
sudo apt-get remove `dpkg --get-selections | grep i386 | awk '{print $1}'`

1如何制作这些命令,我知道apt-get和grep,但awk'{print $1}'是什么意思,只是想知道。 - Sukupa91
真棒,我现在可以删除i386架构,但当我执行dpkg -l | grep i386来检查包是否仍然存在时,有什么想法吗?此外,对于先前的评论和我的猜测与shell脚本技巧有关,点个赞。 - Ismail Marmoush
1没有回应可能是因为评论不适合进行awk教程。这段awk代码只打印每行输入的第一个字段。Awk的默认字段分隔符是空格," "。 - rthbound
1最后用sudo dpkg --remove-architecture i386来完成。 - Serge Stroobandt

如果它们不妨碍你,我会把它们留在原地。
如果你坚持要删除,可以使用dpkg -l | grep i386命令创建一个i386软件包列表。在仔细检查后,你可以使用类似sudo apt-get purge <package-name>的命令来删除这些软件包。

2除非aptitude在multiarch上失效,否则它不会运行得那么好 :P - tumbleweed
apt-get purge <package-name> 应该仍然有效。 - Eliah Kagan
3经过仔细检查之后,"that is vague"这个表达有些含糊不清。请更明确一些。 - kevinarpe
1我有一个i386系统的USB,有时候我会在amd64机器上使用它。现在我只是想做相反的操作,所以在运行dpkg -l | grep amd64之后,我在我的列表中得到了一个i386的软件包,它是amd64-microcode 3.20160316.3 i386。我认为grep模式中的冒号是重要的!(dpkg -l | grep ":amd64" - Yunus

Debian的多架构指南中提到了这个命令:apt-get purge ".*:<arch>",对于i386来说,它看起来是这样的:
sudo apt-get purge ".*:i386"

你可以从dpkg中删除该架构。
sudo dpkg --remove-architecture i386

如果有人想知道,其实有一种更加明智和优雅的方法来做这件事。上一个回答希望达到同样的目的,但是由于架构实际上并不是软件包名称的一部分(除非特殊情况),所以搜索失败了。
以root身份(或使用sudo)运行以下命令:
aptitude remove ~i~ri386

如果你还没有使用aptitude而是用apt-get,那就换过来吧。它真的非常好用。你可以在这里找到aptitude的搜索词列表here

还有一种风险较低的方法:
sudo apt-get remove "^.*:i386$"

这将专门匹配以":i386"结尾的软件包,这是所有i386架构Debian软件包的标准命名约定。

为什么要移除过度清除? - Lotus
1@Lotus:我不清楚其中的区别。你能解释一下吗?也许我们可以更新这个答案以改进它。 - kevinarpe
清除操作会连同配置文件和任何残留目录一并删除,如果我没记错的话。 - Lotus
2@Lotus 我使用了清除命令,并且在14.04版本上成功了。但是只有在去掉引号和尖括号之后,这个方法才对我有效。sudo apt-get purge .*:i386 - Antonios Hadjigeorgalis