ошибка 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.

Предупреждение: данный ответ опасен и может привести к сбою в системе (так как пакет будет установлен, но могут возникнуть новые проблемы, когда оба пакета будут пытаться использовать одну и ту же библиотеку/файл/программу). Используйте ответ Авинаша Раджа вместо этого. Также рассматривайте возможность отправки сообщения об ошибке для обоих конфликтующих пакетов.


Вам нужно принудительно перезаписать файлы, вызывающие проблемы:

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

Пожалуйста, не следуйте напрямую ответу danjjl, если столкнулись с такой ошибкой “попытка перезаписать”, вероятно, у вас есть конфликтующие пакеты, которые нужно сначала разрешить.

Немедленное решение проблемы — удалить конфликтующий пакет, который нежелателен, в данном случае scala,

sudo dpkg -P scala

Следующим шагом рекомендуется отправить сообщение об ошибке соответствующим сопровождающим пакетам. Это обычно подразумевает добавление строки Conflict: package в файл управления.

Также смотрите этот ответ для более детального объяснения об этой ошибке.

Команда danjjl работает с файлами .deb. Я нашел, что эта команда работает с apt/apt-get:

sudo apt-get -o Dpkg::Options::="--force-overwrite" install <package-name>

Не уверен, что это глобальное решение, так как у меня была такая же проблема, но с файлом libglx-mesa в кеше, конфликтующим с Nvidia-390. Я удалил файл и выполнил apt install -f -y, дал этому закончиться и затем продолжил apt update, upgrade и autoremove в этой последовательности.

Я получил ошибку при выполнении apt dist-upgrade на Ubuntu 18.04 и продолжил процесс снова, больше не было проблем, и это, похоже, было “моим” решением.

Команды:

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
# Затем выберите необходимые варианты. Например: для меня я выбрал Нет, Да, Да,
# чтобы выбрать понижение проблемного пакета. Затем он устанавливается и
# работает!

Ответ или решение

Ошибка, связанная с dpkg, известная как "trying to overwrite file, which is also in", указывает на конфликт между двумя пакетами, которые пытаются установить один и тот же файл. Эта проблема часто возникает в Debian-подобных системах, таких как Ubuntu, и может стать преградой для корректной работы системы и установки программного обеспечения.

Понимание проблемы

Когда вы устанавливаете или обновляете пакеты с помощью apt, происходит распаковка файлов из архивов .deb. Если два пакета содержат файл с одним и тем же именем и путем, возникнет конфликт. В вашем случае это связано с пакетом libjline-java, который конфликтует с уже установленным пакетом scala.

Решение проблемы

Шаг 1: Определение и оценка проблемы

  1. Список конфликтующих пакетов: Убедитесь, какие именно пакеты вызывают столкновение. В вашем случае это scala и libjline-java.

  2. Понимание зависимости: Определите, нужен ли вам установочный пакет, который вызывает конфликт. Обычно, если вы знаете, какой пакет более важен для вас, легче принять решение о его дальнейшем использовании.

Шаг 2: Устранение конфликта

  1. Удаление менее нужного пакета: Если scala вам не так нужен, просто удалите его командой:

    sudo dpkg -P scala

    Затем повторите установку:

    sudo apt-get install libjline-java
  2. Принудительное перезаписывание файлов: Хотя это и рискованно, вы можете использовать --force-overwrite. Это сделает установку успешной, но может создать проблемы в дальнейшем:

    sudo dpkg -i --force-overwrite /var/cache/apt/archives/libjline-java_1.0-1_all.deb
    sudo apt-get --fix-broken install

Шаг 3: Альтернативные подходы

  1. Использование aptitude: Эта утилита часто может более грамотно разрешать зависимости:

    sudo apt update
    sudo apt install aptitude
    sudo aptitude install libjline-java
  2. Использование dpkg-divert: Это более профессиональный подход, чтобы избежать конфликта, выклонив существующий файл. Это требует определенных знаний и, как правило, используется опытными пользователями.

Примечание и дальнейшие меры

  • Сообщите об ошибке: Обратитесь к менеджерам пакетов, чтобы они могли исправить этот конфликт в будущих версиях. Это может включать добавление строки Conflicts: в файл управления пакета.
  • Будьте осторожны с принудительными решениями: Принудительное перезаписывание может привести к нестабильности системы в будущем. Проверьте целостность вашего ПО после таких действий.
  • Регулярные обновления: Поддержание вашей системы в актуальном состоянии может предотвратить подобные проблемы в будущем.

Используя такие подходы, вы сможете более эффективно решить возникшую проблему с конфликтами пакетов и минимизировать риск негативных последствий для системы.

Оцените материал
Добавить комментарий

Капча загружается...