dpkg错误:"尝试覆盖文件,该文件也存在于..."

例如:

$ sudo apt-get install curl
Reading package lists... Done
Building dependency tree
Reading state information... Done
You might want to run 'apt-get -f install' to correct these:
The following packages have unmet dependencies:
bsh : Depends: libjline-java but it is not going to be installed
groovy : Depends: libjline-java but it is not going to be installed
rhino : Depends: libjline-java but it is not going to be installed
E: Unmet dependencies. 

Try 'apt-get -f install' with no packages (or specify a solution).

我在尝试安装clojure1.3、leiningen和其他几个软件包时遇到了相同或类似的错误。
当我尝试错误信息中提到的建议时,发生了以下情况:
$ sudo apt-get -f install 
Reading package lists... Done
Building dependency tree       
Reading state information... Done
Correcting dependencies... Done
The following packages were automatically installed and are no longer required:
  diffstat linux-headers-3.2.0-26-generic linux-headers-3.2.0-26 dh-apparmor dkms html2text libmail-sendmail-perl libsys-hostname-long-perl
Use 'apt-get autoremove' to remove them.
The following extra packages will be installed:
  libjline-java
Suggested packages:
  libjline-java-doc
The following NEW packages will be installed:
  libjline-java
0 upgraded, 1 newly installed, 0 to remove and 0 not upgraded.
23 not fully installed or removed.
Need to get 0 B/72.0 kB of archives.
After this operation, 129 kB of additional disk space will be used.
Do you want to continue [Y/n]? Y
(Reading database ... 226243 files and directories currently installed.)
Unpacking libjline-java (from .../libjline-java_1.0-1_all.deb) ...
dpkg: error processing /var/cache/apt/archives/libjline-java_1.0-1_all.deb (--unpack):
 trying to overwrite '/usr/share/java/jline.jar', which is also in package scala 2.9.2-400
Errors were encountered while processing:
 /var/cache/apt/archives/libjline-java_1.0-1_all.deb
E: Sub-process /usr/bin/dpkg returned an error code (1)

$ sudo apt-get upgrade
Reading package lists... Done
Building dependency tree       
Reading state information... Done
You might want to run 'apt-get -f install' to correct these.
The following packages have unmet dependencies:
 bsh : Depends: libjline-java but it is not installed
 groovy : Depends: libjline-java but it is not installed
 rhino : Depends: libjline-java but it is not installed
E: Unmet dependencies. Try using -f.

似乎你需要安装Java,可以在软件中心搜索安装。 - Mark Kirby
2可能是这个问答的重复,或者至少这个解决方案应该会有所帮助。 - danjjl
@markkirby,如果你的问题是我是否运行了sudo apt-get update,那是的,我已经运行过了。 - missingfaktor
这里@Lety提供的解决方案是最合适且最不侵入性的方法,如果你正在处理自己的安装程序 - https://askubuntu.com/questions/491401/how-do-i-install-a-so-file-newbie - zookastos
6个回答

警告:此答案具有危险性,可能导致系统崩溃(因为这将有效安装软件包,但当两个软件包尝试使用相同的库/文件/二进制文件时,可能会出现新问题)。请改用Avinash Raj的答案。同时考虑报告两个冲突软件包的错误。
你必须强制覆盖导致问题的文件。
sudo dpkg -i --force-overwrite <file-path>

在你的情况下,应该是这样的:
sudo dpkg -i --force-overwrite /var/cache/apt/archives/libjline-java_1.0-1_all.deb

检查一切是否已修复,运行以下命令:
sudo apt-get --fix-broken install

如果您仍然遇到问题,请使用任何尚未处理的 dpkg: error processing (...) 重新运行第一步。

webupd8 上找到的解决方案


11这将有效地安装软件包,但当两个软件包尝试使用相同的库/文件/二进制文件时,问题仍然存在。 - Braiam
20不好意思,那绝对是一个注定失败的方案... - fkraiem
"force-overwrite" 可能至少应该有一种警告/免责声明。 - reducing activity
太棒了,这应该是被接受的答案。 - AbstProcDo
你可以提供更多关于 --force-overwrite 的信息吗?在当前的 dpkg 上似乎没有找到。 链接 - Pablo Bianchi
这个答案很危险!请使用Avinash Raj的答案,并向两个软件包维护者提交错误报告。在我的情况下,冲突发生在mono-develdiscodos之间。我卸载了discodos - Amedee Van Gasse
冲突的文件可能只是一个“man”页面(我不确定的是,apt是否只报告第一个冲突的文件还是报告所有冲突的文件,即可能因为一个“man”页面而退出错误,你再次运行它时使用“--force-overwrite”,然后覆盖了一些重要的二进制文件)。 - golimar
这确实在我升级到Ubuntu 22.04后帮了我一把忙。但是没错,这是危险的操作。在进行此操作时,请准备好启动USB。 - Lizozom
哦,你真是救了我一命啊。Python-numpy简直让我抓狂。我甚至删除了所有相关的东西,但还是没有成功。谢谢。 - DimiDak
当冲突的文件是一个背景JPG文件时,我使用了这个命令。我以为这不会引起最大的问题。 - IIVQ
这是唯一对我起作用的方法,当在 Debian 测试版上进行直接软件包升级失败时(没有涉及第二个软件包,可能只是一个有问题的脚本)。非常感谢你。 - ChrisB

请不要直接选择danjjl answer,如果你遇到这种“试图覆盖”的错误,很可能是因为你有冲突的软件包需要先解决。
解决这个问题的即时方法是删除不需要的冲突软件包,比如scala
sudo dpkg -P scala

下一步建议与相应的软件包维护人员提交错误报告。通常这意味着在控制文件中添加一行冲突:软件包
此外,还可以参考this答案,以获取更详细的关于此错误的解释。

7对这个建议我不太确定。我认为这要取决于具体情况。在你早期贴子的链接中,有两个版本的同一款软件之间存在冲突。我同意那里提到的应该先卸载较旧的软件。然而,如果两个不同程序的打包方式存在问题,被覆盖的文件是相同的或者无害的,那么我认为这个建议没有问题。虽然不理想,但如果另一个选择是等待问题得到修复,那么要求别人不采用某个特定答案可能有些过分了。 - Ray
在这种情况下,可能需要提交一个错误报告...但我怀疑来自Ubuntu软件仓库的软件会有这个问题,因为它们是从Debian获取的,并且Debian对这些问题进行了详尽的测试。 - Braiam
1@Braiam 我已经很久没用 Debian 了。也许现在好些了,但我曾遇到过类似的问题。这并不是因为缺乏全面测试,而是有时很难测试到每种可能的情况。无论进行多少次测试,总会有一些问题会被忽略掉。我并不反对写 bug 报告,但“说起来容易做起来难”。毕竟,总结所有相互冲突的软件包可能会很困难。而且,如果 bug 不是“热门”(即它们没有影响很多人),你只能等待。 - Ray
1也许最好修改原始答案,这样它会说:“因为(某个原因),请不要这样做。” 这样一来,当有人了解利弊后,他们可以选择忽略它。就像现在的回答只是说不要这样做一样。 - Ray
@Ray 嗯...在构建一个软件包时,dpkg会存储一个文件列表(dpkg -L package),简单地查找冲突应该足够作为第一步措施。而通过详尽的测试,我是指实际世界的测试,不稳定版本和测试版本就是为了解决这种问题。 - Braiam
@Ray,你真的不想要两个版本的同一个软件包。你不想要这样。长远来看,这只会带来更多问题,这个回答确保你明白这一点,并且建议你要认真对待,而不是“忽视”。 - Braiam
关于冲突问题——我不知道dpkg是如何工作的。你抓住了我。但是我见过它几次(也就是说,非常少见...一年或两年一次?)以至于我认为有些东西确实会被忽略。至于你的第二点,我同意你的观点,同时拥有两个版本的相同软件包并不好。只是我认为原始声明中不要听从他人建议有点过于强硬。使用--force-overwrite是有时机和场合的,并通过提供利弊来解释似乎比说不要听从有效的建议更有帮助。 - Ray
只是为了澄清一下,我注意到你最近编辑了答案。所以,我不知道8个月前当我第一次写下我的评论时它说了什么。如果你正在编辑答案并改进它,那太好了!但是随着你的编辑,我的话变得越来越不相关。 - Ray
在我的情况下,我使用checkinstall来创建一个自定义版本的GTK3,而在Debian中,它被分成了几个包。因为我不确定libgtk3被分成了多少个包,所以我为所有内容创建了一个单一的包。当libgtk-3-0更新时,这个包将会被自动替换,所以我对此有一个有效的使用案例。 - Wyatt Ward
2FYI,这个解决方案对我有效。在我的情况下,有问题的软件包是libc6-dev-i386 - FractalSpace
我发现nvidia-418与nvidia-390冲突了。那我应该如何升级驱动程序呢? - Aaron Franke
先卸载所有的NVIDIA驱动程序,然后安装418版本。 - Avinash Raj
经过几个小时的纠结,我终于找到了解决方法。问题出在 libkf5akonadi-data 这个软件包上。谢谢! - dargaud
似乎对我有效,我执行了sudo dpkg -P libaudqt2命令,这是旧的软件包,然后执行sudo apt --fix-broken install命令成功了(之前无法成功)。 - Yan King Yin
这个救了我一些Qt开发包。 - Dirk Hartzer Waldeck
在我的情况下,冲突出现在mono-develdiscodos之间。我卸载了discodos。对我来说解决了问题。 - Amedee Van Gasse
我在那个危险的回答上添加了一个警告。它已经在编辑队列中,所以如果有更高声望的人能够批准我的编辑,那就太好了。我的StackExchange声望大部分都在StackOverflow上,所以我不能直接在这里进行编辑。 - Amedee Van Gasse
工作的結果是執行 sudo dpkg -P python3.7-distutils正在解壓縮 libpython3.7-stdlib:amd64 (3.7.13-1+focal3),並覆蓋原有版本 (3.7.13-1+focal1) ... 處理套件 /var/cache/apt/archives/libpython3.7-stdlib_3.7.13-1+focal3_amd64.deb 時發生錯誤 (--unpack): 嘗試覆寫 '/usr/lib/python3.7/distutils/__init__.py',但這個檔案也在套件 python3.7-distutils 3.7.13-1+focal1 中非常感謝,祝您周末愉快 :D - Raphaël Duchaîne

@danjjl的命令适用于.deb文件。我发现这个命令可以与apt/apt-get一起使用:
sudo apt-get -o Dpkg::Options::="--force-overwrite" install <package-name>

5很好的提示。不过要小心:如果文件不同,覆盖可能会导致严重问题。其中一个冲突的软件包将无法正常工作。 - Potaito
8对于类似的问题,sudo apt-get -o Dpkg::Options::="--force-overwrite" install -f 对我有效。 - user2205916
@猫:更像是“伟大的黑客”嘛。;-] - David Foerster
-o Dpkg::Options::="--force-overwrite"添加到我的apt命令中解决了我的问题!谢谢。 - Thamme Gowda

不确定这是否是一个全局解决方案,因为我遇到了同样的问题,但是我的缓存中有一个与 Nvidia-390 冲突的 libglx-mesa 文件。我删除了该文件,并执行了 apt install -f -y,等待其完成,然后按顺序进行了 apt updateupgradeautoremove

当我在 Ubuntu 18.04 上执行 apt dist-upgrade 时遇到了错误,然后再次执行该过程,没有出现其他问题,这似乎是“我的”解决方案。

命令:

sudo su -
mv /var/cache/apt/archives/libglx-mesa0_18.0.0~rc5-1ubuntu1_amd64.deb ~
apt install -f -y
apt update -y
apt upgrade -y
apt autoremove -y
apt dist-upgrade

PS: 强行覆盖是一个我尝试过并且走运的不好的想法。但是找到根本原因并修复它是更好的选择。虽然我仍需要调查,但这个错误引导我将文件移开了。

所以dpkg --force-overwrite是在这里以各种形式呈现的巧妙解决方法。但是dpkg-divert(8)是处理这种情况的预期方式。

对于Debian、Ubuntu等系统,让aptitude来处理它吧:
sudo apt update
sudo apt install aptitude

sudo aptitude install my_package_name
# Then choose the necessary options. Ex: for me I choose No, Yes, Yes,
# to choose to downgrade the troublesome package. Then it installs and
# works!