如何移除/安装一个未完全安装的软件包?

我前几天去安装bsnes,但由于某种原因,安装失败了。现在,我无法更新、安装新的软件包或者执行基本的apt-get命令,因为它们都试图处理这个损坏的软件包并失败了。尝试安装一个新软件包也注定会遭遇同样的命运。
我收到的错误信息是:
Setting up google-chrome-stable (33.0.1750.152-1) ...
/var/lib/dpkg/info/google-chrome-stable.postinst: 124: /var/lib/dpkg/info/google-chrome-stable.postinst: update-alternatives: not found
dpkg: error processing google-chrome-stable (--configure):
 subprocess installed post-installation script returned error exit status 127
Setting up bsnes (0.088-7) ...
/var/lib/dpkg/info/bsnes.postinst: 5: /var/lib/dpkg/info/bsnes.postinst: update-alternatives: not found
dpkg: error processing bsnes (--configure):
 subprocess installed post-installation script returned error exit status 127
Errors were encountered while processing:
 google-chrome-stable
 bsnes
E: Sub-process /usr/bin/dpkg returned an error code (1)

我在Google和Ask Ubuntu上搜索了很久,但没有找到有效的解决方案。
常见建议的修复方法是运行以下命令:
sudo apt-get clean && sudo apt-get autoremove
sudo apt-get -f install
sudo dpkg --configure -a

这个方法不起作用。apt-get命令都以与上述相同的错误失败,而dpkg命令则没有帮助。他们经常建议通过Synaptic或命令行清除它,但这也失败了。
10个回答

对于高级用户,请自行承担风险。

根据以下错误信息:

subprocess installed post-installation script returned error exit status 127

你可能想要编辑/var/lib/dpkg/info/[package_name].postinst文件,并注释掉所有内容(或者更好的是,尝试理解并找出问题),然后再次尝试apt-get命令。
请注意,虽然在这个特定的问题中,消息涉及到"安装后",但也可能提到"卸载前"或"卸载后"(在这种情况下,要编辑的文件扩展名将为.prerm.postrm)。

2实际上这是最好的方法。重新安装dpkg并不总是有帮助的。 - Danatela
3非常感谢。我必须修复/var/lib/dpkg/info/[package_name].prerm,但是你的帖子给了我正确的方向。这绝对是面向高级用户的,风险很大! - sмurf
3最佳答案。谢谢!修正.prerm.postrm文件可以解决问题。 - fuser
3终于有个有效的方法了。删除该软件包的.prerm文件也是一个选择。这对于.prerm文件等也适用,终于有了几乎等同于rpm -e --noscripts的方法 :) - rogerdpack
因为在Ubuntu 22.04.1上安装失败,我无法移除dokku,这导致我无法执行sudo apt-get update && sudo apt-get upgrade。然后我在/var/lib/dpkg/info/dokku.prerm中注释掉了所有内容,问题就解决了。 - Arda Basoglu
@ArdaBasoglu 请确保理解你所注释的内容,否则可能会导致其他问题。 - Skippy le Grand Gourou
太棒了!谢谢 - undefined

除了您已经发布的那些命令外,还有一些其他有用的命令。
  • Autoclean清除本地仓库中已获取的软件包文件。

    sudo apt-get autoclean
    
  • 强制安装/卸载软件包。 ☠谨慎使用

    sudo apt-get --force-yes 安装 <软件包名称>
    

    sudo apt-get --force-yes 卸载 <软件包名称>
    
同样地,你可以像往常一样使用 dpkg 来安装、移除和清理软件包。
  • 安装

    sudo dpkg -i <pkgname>
    
  • 卸载

    sudo dpkg -r <pkgname>
    
  • 彻底删除

    sudo dpkg -P <pkgname>
    

2无论是dpkg还是apt-get --force-yes命令,都返回与之前相同的错误。Autoclean没有返回错误,但似乎也没有对这两个损坏的软件包做任何操作。 - Bijak
@Bijak 你肯定已经尝试过清除 bsnes 了吧?你试过了吗? - Registered User
是的,使用dpkg -P、apt-get purge和Synaptic。 - Bijak
请将dpkg -l |grep bsnes的输出结果发布出来。 - Registered User
rF bsnes 0.088-7 amd64 高精度的SNES/SuperFamicom模拟器 - Bijak
иҝҷж„Ҹе‘ізқҖдҪ иҝҳжІЎжңү移йҷӨbsnesгҖӮиҜ•иҜ•sudo apt-get purge --force-yes bsnesгҖӮ - Registered User
当它尝试处理bsnes时,它会立即出现错误(对于损坏的Chrome软件包也是如此)。与原始问题中粘贴的相同错误。 - Bijak
E: 命令行选项--configure不能被理解。--configure不是仅供dpkg使用的选项吗?在apt-get的手册页中我没有找到它。但是当你使用apt-get做某些操作时,出错的确切步骤就是dpkg --configure。 - Bijak
对不起,这是个错误。运行 sudo dpkg --configure bsnes - Registered User
是的,这个失败了,而且也是 apt-get 命令失败的步骤。正在设置 bsnes (0.088-7) ... /var/lib/dpkg/info/bsnes.postinst: 5: /var/lib/dpkg/info/bsnes.postinst: update-alternatives: 找不到命令 dpkg: 处理软件包 bsnes (--configure)时出错: 子进程已安装的 post-installation 脚本返回错误的退出状态 127 - Bijak
sudo apt-get --force-yes remove <pkgname> 在Linux Mint 18.1上修复了我安装oracle-java7-installer时出现的问题。 - Ben Mordecai
apt-get对我来说行不通,因为它抱怨缺少一个依赖项,而我无法安装该依赖项,因为/boot空间不足。不过,使用dpkg的方法对我有效 - 谢谢! - poshaughnessy
sudo dpkg -r evdi-dkms 对我来说解决了这个问题!那个软件包在安装失败的状态下"卡住"了,导致sudo apt upgrade无法工作,并且所有其他软件包的sudo apt install命令都会失败。 - undefined

你可以在路径 /var/lib/dpkg/info/ 中删除包文件并更新源代码。
sudo rm /var/lib/dpkg/info/[package_name].*
sudo dpkg --configure -a
sudo apt-get update

然后,重新安装您的软件包sudo apt-get install [package_name]

文档


6其实你最好使用sudo rm /var/lib/dpkg/info/[pakege_name].*。否则你会同时删除以相同名称开头的包。不管怎样,谢谢你,这是唯一对我有效的解决方案。 - smac89
非常感谢,我花了30分钟尝试恢复错误版本的libc6安装,直到找到这个答案。 - yeah22
非常感谢您快速帮助解决这个问题。 - Stephan
唯一的解决方案。其他20个解决方案只是用来伪装的虚假指令。 - sixtytrees

所以,在更多的谷歌搜索和仔细阅读错误消息后,似乎需要重新安装 dpkg
sudo apt-get install --reinstall dpkg

如果有人搜索并看到这个问题,那么提示这是问题的线索就是错误信息中出现了“update-alternatives: not found”。一旦重新安装了dpkg,其他软件包就会自动正常安装。

4为什么目前唯一正确(且被接受的)答案要排在列表的最下面,得票量还不到最高答案的三分之一呢?+1 - David Foerster
1首先,这是因为它对于无法再下载的软件包无效。例如:"无法重新安装 linux-image-extra-4.4.0-65-generic,无法下载该软件包。" - Joe
5这可能是基于问题标题来到这里的人最不太可能的解决方案。但是有很多原因会导致出现这个问题,所以会有很多被提出的“这对我有效”的解决方案。 - michael
1这实际上不起作用。 - NelsonGon
在众多其他选择中,只有这一个对我有效。 - Himanshu
我遇到了一个问题,旧版本的软件包与我的当前版本发生了冲突。由于我尝试安装新版本,它没有被正确卸载。这个方法帮助我修复了旧版本的安装问题,然后我彻底移除了它并安装了新版本。 - Shravya Boggarapu
太棒了!这真的帮了很多忙,Hamed的回答也非常有帮助! - Stephan

如果所有其他方法都失败了。我所做的是首先将目录更改为:
cd /var/lib/dpkg/info

然后我删除了所有带有.postinst的内容:
sudo rm *.postinst

然后更新存储库
sudo apt-get update

然后当我做了以下的事情时,一切都恢复正常了:
sudo apt-get --force-yes install openjdk-7-jre-headless

12这将删除所有的安装后脚本,而不仅仅是受影响的软件包的脚本。在我看来有点过于热衷了。-1 - David Foerster
如果能够轻松地识别并删除导致问题的特定后安装脚本,这将是一种非常方便的方法来移除一个失败的软件包。 - Ian Mackinnon
经历了与内核问题有关的噩梦后,仅重命名受影响内核的 .postinst 解决了该问题。 - Andy
这个命令(rm *.postinst)在我尝试了很多其他方法后起效了。谢谢! - mr.zog

如果其他方法都失败了,你可以通过dpkg手动删除软件包。运行sudo dpkg -P bsnes应该能够彻底清除bsnes

4dpkg: error processing package libcuda1-340 (--purge): package is in a very bad inconsistent state; you should reinstall it before attempting a removal - endolith

在我的情况下,apt-get install -f 运行成功。我正在安装 mysql-workbench-community。
之前尝试过 apt autoclean
我发现 dpkg 错误是由于一些缺少的依赖项造成的,可以通过强制模式安装(安装依赖项)来纠正。

试试这个:

sudo dpkg -l | grep '^.[^i]'

然后,对于每个在第一列和第二列中有除了ii以外的内容,或者在第三列中有..R的软件包,使用以下命令将其移除:
sudo dpkg --remove --force-all package_name  ## You might need to do this a lot
sudo apt-get clean
sudo apt-get update
sudo apt-get --fix-broken install

希望这样能解决问题。

i 字符通常是安装状态或期望状态。有一个描述在:解释 dpkg(--list)的状态的方法 - rusty
单独运行sudo apt-get --fix-broken install可能会为您解决问题(对我来说确实有效)。 - rsenna

sudo apt-get install -f --reinstall coreutils init-system-helpers

运行上述命令后,您可以像往常一样安装/升级/移除/清除任何软件包。

这在你的特定情况下奏效。但不适用于每一种情况。 - Error404

我曾经遇到过类似的情况,有多个未完全安装的软件包,而且我不知道它们是什么。为了解决这个问题,我按照以下答案进行操作: https://unix.stackexchange.com/a/114193 具体步骤如下:
  1. 使用sudo dpkg -C命令获取所有处于不完整安装状态的软件包列表。
  2. 编辑提供的列表,使其只包含软件包名称的一行。
  3. 对所有这些软件包运行sudo dpkg --configure [用空格分隔的软件包列表]命令。
  4. 运行sudo dpkg --configure --pending命令,以处理第3步中无法解决的少数软件包。
然而,我不确定是否只需要第4步,或者sudo dpkg --configure -a && sudo dpkg --configure --pending这一行就足够了。无论如何,上述的4个步骤解决了我的问题。