Pacman "існує у файловій системі" помилка


38

Я побіг sudo pacman -Syuі отримав кілька цікавих помилок при читанні:

помилка: не вдалося здійснити транзакцію (конфліктуючі файли)

і довгий список файлів, за якими слідує exists in filesystem. Повний вихід тут: http://ix.io/lLw

Здається, що багато з цих файлів не пов’язані з пакетом, коли я перевіряв їх pacman -Qo <path-to-file>, але я не перевіряв їх усіх. У мене був слабкий зв’язок, коли я біг pacman -Syu, але я отримую ті ж помилки, коли я оновлювався пізніше: http://ix.io/lLx

Що я повинен зробити? Чи слід перевірити всі файли та видалити файли, у яких немає пов'язаного пакету? Чи варто примушувати оновлення (з sudo pacman -S --force <package-name>?)

Оновлення

Я спробував запустити sudo pacman -S --force <package-name>:

[my-pc]/home/average-joe$ pacman -Qo /usr/lib/python3.5/site-packages/PyYAML-3.11-py3.5.egg-info
error: No package owns /usr/lib/python3.5/site-packages/PyYAML-3.11-py3.5.egg-info

Схоже pacman -S --force <package, не перезаписуються каталоги, які містять файли. Від людини:

Використання --force не дозволить перезаписати каталог з файлом або встановити пакети з конфліктуючими файлами та каталогами.

Чи слід просто видалити конфліктуючі каталоги? (вони не мають пов'язаних пакетів)


5
чому у вас в першу чергу конфліктні файли? під час використання менеджера пакунків намагайтеся не натискати на пальці ніг (наприклад, встановлюючи програмне забезпечення в місцях, де менеджер пакунків справедливо вважає, що це їх; якщо ви повинні встановити речі вручну, встановіть /usr/local/замість цього /usr/)
umläute

1
@ umläute Я не зовсім впевнений, звідки взялися конфліктуючі файли, але я підозрюю, що вони пов'язані з моєю установкою докер-композиції, яку я встановив за допомогою sudo pip install -U docker-compose==1.5.0rc3 цієї сторінки . Можливо, sudo pip installконфлікт з Pacman?
modulitos

2
@ umläute Якщо ви отримаєте помилкові -Sоновлення (часткові встановлення тощо), це дозволить вам зробити цей сценарій. Справа зі мною --forceпрацювала весь час.
м3нда

Відповіді:


28

Гаразд, це виглядає як працює sudo pacman -S --force <package-name>, але це не вирішує конфліктуючі каталоги. У таких випадках працює sudo rm -rfнад конфліктуючими каталогами, за якими слідують sudo pacman -S --force <package-name>твори.

Зараз мій pacman -Syuвирішує добре.


6
- сила застаріла; використовувати замість --overwrite
Анкіт Балян

7
--force працює для мене , але --overWrite НЕ
Infernion

3
sudo pacman -Syu --forceпрацював для мене, але перезапис не було розпізнано
шпидон

21

tl; dr: видаліть конфліктну програму перед запуском pacman.

pacman(та інші менеджери пакунків) зберігають індекс пакетів та файлів, якими вони керують ( pacman --query --list). Деякі файли, такі як конфігурація, будуть позначені як модифіковані, і вони не будуть перезаписані під час оновлення (за винятком особливих обставин, коли менеджер пакунків зазвичай пересуває старий файл перед створенням нового). Інші файли будуть позначені як немодифіковані. Якщо інша програма будь-яким чином змінює ці файли, не оновлюючи індекс відповідно, немає можливості менеджеру пакунків знати, що робити з цими файлами під час оновлення.

Багато додатків, встановлених за допомогою стандартного ./configure && make && sudo make installшаблону, можна видалити за допомогою sudo make uninstall. Якщо ви інсталювали додаток іншим способом, можливо, вам доведеться дещо інсталювати його. Взагалі може бути хорошою ідеєю зберігати копію інсталяційних файлів десь (наприклад ~/install), щоб можна було надійно видалити їх у таких випадках. Просто видалення конфліктуючих файлів, ймовірно, залишить інші файли, що лежать навколо, що, можливо, може спричинити інші проблеми.

Під час встановлення програмного забезпечення з іншими менеджерами пакетів існують способи виділення цих програм із системних файлів. Це встановлена ​​найкраща практика, наприклад, під час розробки програмного забезпечення, де ви дійсно хочете підтримувати версії послідовними та уникати конфліктів з іншим програмним забезпеченням. Приклади включають:


2
Дивіться мій коментар до @umlaute вище. Я думаю, що конфлікт був від sudo pip installкоманди. Можливо, я повинен уникати використання піп з судо?
modulitos

3

Я встановлював пакунки, які зазвичай встановлюю за допомогою pip через pacman через це. Але деякі пакунки не знайдені в репозі Pacman. Я думаю, що нам слід уникати встановлення pip з привілеями sudo та istead:

pip install pillow --user

- прапор користувача використовує пакети встановлення піп у вашому домашньому каталозі, що не вимагає спеціальних привілеїв. https://stackoverflow.com/questions/42988977/what-is-the-purpose-pip-install-user


2

TLDR;

  1. Отримайте список образливих файлів (скопіюйте та вставте вихідні дані Pacman у файл).
  2. Використовуйте awk, щоб викреслити все, крім шляхів файлів, до нового списку.
  3. Використовуйте при цьому для переміщення порушених файлів із шляху, виходячи зі списку.
  4. Біжи sudo pacman -Syuзнову.

    відредаговано, щоб додати TLDR та виправити помилки

Хоча я майже впевнений, що не робив нічого дурного, але у мене виникли ці проблеми, можливо, кожен раз, коли я намагався оновити, оскільки використовую Manjaro; три-чотири рази протягом двох місяців. Справа в тому, що це фіксує.

Отримайте список своїх файлів.

Коли оновлення не завершиться у вікні вашого терміналу, ви отримуєте це:

error: failed to commit transaction (conflicting files)
evilfile: /usr/bin/evilfile exists in filesystem
libx000: /usr/lib/libx000.so.f.u.loser exists in filesystem
accountsservice: /usr/share/locale/ru/LC_MESSAGES/accounts-service.mo.yu.dnt.evn.spk.russian exists in filesystem

... і багато іншого.

  • Скопіюйте висновок з терміналу і покладіть його у файл. Я використав нано і назвав мої "файли", як у ~ / work / files .

  • Видаліть сторонні дані:

    cat files | awk '{print $2}' >> ~/work/files2

    Це займає друге "слово" з кожного рядка і друкує його у файли2.

Робота з файлами

  • Ви можете їх видалити, перемістити або перейменувати.

  • Якщо щось зламається, це найлегше виправити, якщо ми порушимо його, перемістивши його замість того, щоб видалити або перейменувати:
    mkdir ~/work/oldfiles while read -r file; do sudo mv -- "$file" ~/work/oldfiles/$file; done < files2

  • Якщо ви дійсно хочете їх видалити, чого немає підстав робити ( ОПАСНОСТЬ ОПАСНОСТІ ): під час читання -r файл; do sudo rm - "$ файл"; зроблено <файли2

Оновлення

  • Щоб змусити --overwrite працювати, що нам потрібно зробити, щоб Pacman зрозумів, що пакет не порушений, вам потрібен наступний синтаксис:

    sudo pacman -S package_name --overwrite /location/of/thing

    • У моєму випадку: sudo pacman -S libidn2 --overwrite /usr/lib/libidn2.so.0
    • Слідуючи прикладу: sudo pacman -S libx000 --overwrite /usr/lib/libx000.so.f.u.loser
  • У мене була симпатична проблема, коли, якщо я видалив libidn2.so.0 symlink, нічого не працювало, і коли я повернув її назад, я отримав помилку "існує у файловій системі". Вище сказане, з - overwrite - це все, що працювало на мене.

  • Нарешті:

    sudo pacman -Syu


2

Після того, як Pacman остаточно знехтував --forceваріант і змусив сурогатний --overwriteваріант працювати, як очікувалося, слід зазначити наступну схему використання.

Еквівалентна команда для відтворення --forceопції, яка сліпо переписує будь-що, що є конфліктом:

sudo pacman -S --overwrite \*

Або

sudo pacman -S --overwrite "*"

Хитра частина - це втеча від глобуса, щоб уникнути розширення оболонки спочатку.


Це прекрасно працює, дякую!
EkriirkE

0

Якщо у вас багато файлів, як у мене,

sudo pacman --force -Syyu  

вирішує всі питання.


варіант - сила застаріла; використовувати --overwrite замість цього
Махмуд Халед

- overoverrite, здається, повинен вказати, що перезаписати. В даний час використовуйте --сила все добре
xsilen T
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.