Ошибка pacman «существует в файловой системе»

Ошибка pacman «существует в файловой системе»

Я запустил 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 не позволит перезаписать каталог файлом или установить пакеты с конфликтующими файлами и каталогами.

Должен ли я просто удалить конфликтующие каталоги? (они не имеют связанных пакетов)

решение1

После того, как pacman окончательно отказался от этой --forceопции и заставил суррогатную --overwriteопцию работать так, как ожидалось, следует отметить следующую схему использования.

Команда для воспроизведения --forceопции, которая слепо перезаписывает все, что конфликтует, выглядит следующим образом:

sudo pacman -S --overwrite \* <package_name>

Или

sudo pacman -S --overwrite "*" <package_name>

Самое сложное — обойти джокер, чтобы оболочка не успела его расширить.

решение2

Ок, похоже, что запуск sudo pacman -S --force <package-name>работает, но не разрешает конфликтующие каталоги. В таких случаях запуск sudo rm -rfв конфликтующих каталогах, за которым следует sudo pacman -S --force <package-name>работа.

Теперь у меня pacman -Syuвсе хорошо решается.

решение3

tl;dr: Перед запуском удалите конфликтующее приложение pacman.

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

Многие приложения, установленные с использованием стандартного ./configure && make && sudo make installшаблона, можно удалить с помощьюsudo make uninstall. Если вы установили приложение каким-то другим способом, вам, возможно, придется сделать что-то еще, чтобы удалить его. В общем, это может быть хорошей идеейсохраните копию установочных файловгде-то (например ~/install), чтобы иметь возможность надежно удалить их в таких случаях. Простое удаление конфликтующих файлов, вероятно, оставит другие файлы лежать, что может вызвать другие проблемы.

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

решение4

Кратко;

  1. Получите список проблемных файлов (скопируйте и вставьте вывод pacman в файл).
  2. Использоватьawkчтобы удалить все, кроме путей к файлам, в новый список.
  3. Использоватьпокадля удаления проблемных файлов в соответствии со списком.
  4. Беги sudo pacman -Syuснова.

    отредактировано для добавления краткого содержания и исправления опечаток

Хотя я почти уверен, что не делал ничего глупого, у меня эта проблема возникала, наверное, каждый второй раз, когда я пытался обновиться с тех пор, как я начал использовать 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

... и многое другое.

  • Скопируйте вывод из терминала и поместите его в файл. Я использовалнано, и назвал свои «файлы», как в~/работа/файлы.

  • Удалить лишнюю информацию:

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

    Это берет второе «слово» из каждой строки и печатает его в files2.

Разобраться с файлами

  • Вы можете удалить их, переместить или переименовать.

  • Если что-то сломалось, проще всего это исправить, переместив это, а не удаляя или переименовывая:
    mkdir ~/work/oldfiles while read -r file; do sudo mv -- "$file" ~/work/oldfiles/$file; done < files2

  • Если вы действительно хотите их удалить, то нет смысла это делать (ОПАСНОСТЬ ОПАСНОСТЬ):пока читаем -r файл; делаем sudo rm -- "$file"; сделано < files2

Обновление

  • Чтобы заставить работать --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, ничего не работало, а когда я ставил ее обратно, я получал ошибку "exists on filesystem". Вышеуказанное, с --overwrite, — это все, что сработало для меня.

  • Окончательно:

    sudo pacman -Syu

Связанный контент