Pacman-Fehler „existiert im Dateisystem“

Pacman-Fehler „existiert im Dateisystem“

Ich bin gelaufen sudo pacman -Syuund habe beim Lesen einige interessante Fehlermeldungen bekommen:

Fehler: Transaktion konnte nicht bestätigt werden (konfliktierende Dateien)

und eine lange Liste von Dateien, gefolgt von exists in filesystem. Die vollständige Ausgabe finden Sie hier:http://ix.io/lLw

Es scheint, dass viele dieser Dateien keinem Paket zugeordnet sind, als ich sie mit überprüft habe pacman -Qo <path-to-file>, aber ich habe nicht alle überprüft. Ich hatte eine schwache Verbindung, als ich ausgeführt habe pacman -Syu, aber ich erhalte die gleichen Fehler, wenn ich später aktualisiert habe:http://ix.io/lLx

Was soll ich tun? Soll ich alle Dateien prüfen und diejenigen löschen, denen kein Paket zugeordnet ist? Soll ich ein Update erzwingen (mit sudo pacman -S --force <package-name>?)

Aktualisieren

Ich habe es versucht sudo pacman -S --force <package-name>und das hier kam:

[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

Es sieht so aus, als ob pacman -S --force <packageVerzeichnisse, die Dateien enthalten, nicht überschrieben werden. Von dem Mann:

Die Verwendung von --force ermöglicht nicht das Überschreiben eines Verzeichnisses mit einer Datei oder die Installation von Paketen mit in Konflikt stehenden Dateien und Verzeichnissen.

Soll ich einfach die in Konflikt stehenden Verzeichnisse löschen? (Sie haben keine zugehörigen Pakete)

Antwort1

Nachdem Pacman die --forceOption schließlich verworfen und dafür gesorgt hat, dass die Ersatzoption --overwritewie erwartet funktioniert, sollte das folgende Verwendungsmuster beachtet werden.

Ein Befehl zum Reproduzieren der --forceOption, die blind alle Konflikte überschreibt, lautet wie folgt:

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

Oder

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

Der schwierige Teil besteht darin, das Platzhalterzeichen zu umgehen, um zu verhindern, dass die Shell es zuerst erweitert.

Antwort2

Ok, es sieht so aus, als ob das Ausführen sudo pacman -S --force <package-name>funktioniert, aber es löst keine Verzeichniskonflikte auf. In solchen Fällen funktioniert das Ausführen sudo rm -rfin den Verzeichnissen, gefolgt von sudo pacman -S --force <package-name>.

Nun pacman -Syugut, mein Vorsatz.

Antwort3

tl;dr: Deinstallieren Sie die in Konflikt stehende Anwendung, bevor Sie sie ausführen pacman.

pacman(und andere Paketmanager) führen eineIndex der Pakete und Dateiendie sie verwalten ( pacman --query --list). Einige Dateien, wie z. B. Konfigurationsdateien, werden als veränderbar markiert und beim Upgrade nicht überschrieben (außer in besonderen Fällen, in denen der Paketmanager normalerweise die alte Datei wegschiebt, bevor er die neue erstellt). Andere Dateien werden als nicht veränderbar markiert.Wenn eine andere Anwendung diese Dateien in irgendeiner Weise ändert, ohne den Index entsprechend zu aktualisieren, weiß der Paketmanager nicht, was bei einem Upgrade mit diesen Dateien zu tun ist.

Viele Anwendungen, die mit dem Standardmuster installiert wurden, ./configure && make && sudo make installkönnen deinstalliert werden mitsudo make uninstall. Wenn Sie die Anwendung auf andere Weise installiert haben, müssen Sie sie möglicherweise auf andere Weise deinstallieren. Im Allgemeinen kann es eine gute Idee sein,Bewahren Sie eine Kopie der Installationsdateien aufirgendwo (zum Beispiel ~/install), um sie in solchen Fällen zuverlässig deinstallieren zu können. Wenn Sie nur die widersprüchlichen Dateien entfernen, bleiben wahrscheinlich andere Dateien übrig, was möglicherweise andere Probleme verursachen könnte.

Beim Installieren von Software mit anderen Paketmanagern gibt es Möglichkeiten, diese von den Systemdateien zu isolieren. Dies ist beispielsweise bei der Softwareentwicklung eine bewährte Vorgehensweise, bei der Sie die Versionen unbedingt konsistent halten und Konflikte mit anderer Software vermeiden möchten. Beispiele hierfür sind:

Antwort4

Kurz und knapp;

  1. Holen Sie sich eine Liste der fehlerhaften Dateien (kopieren Sie die PacMan-Ausgabe und fügen Sie sie in eine Datei ein).
  2. Verwendenawkum alles außer den Dateipfaden in eine neue Liste zu entfernen.
  3. Verwendenwährendum die fehlerhaften Dateien basierend auf der Liste aus dem Weg zu räumen.
  4. Führe es sudo pacman -Syunochmals aus.

    bearbeitet, um TLDR hinzuzufügen und Tippfehler zu korrigieren

Obwohl ich ziemlich sicher bin, dass ich nichts Dummes getan habe, hatte ich dieses Problem vielleicht bei jedem zweiten Update-Versuch, seit ich Manjaro verwende; drei oder vier Mal innerhalb von zwei Monaten. Der Punkt ist, dass dies das Problem behebt.

Holen Sie sich eine Liste Ihrer Dateien.

Wenn das Update in Ihrem Terminalfenster fehlschlägt, erhalten Sie Folgendes:

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

... und vieles mehr.

  • Kopieren Sie die Ausgabe vom Terminal und speichern Sie sie in einer Datei. Ich habeNanometerund nannte meine "Dateien", wie in~/Arbeit/Dateien.

  • Überflüssige Informationen entfernen:

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

    Dies nimmt das zweite „Wort“ aus jeder Zeile und druckt es in Dateien2.

Umgang mit den Dateien

  • Sie können sie löschen, verschieben oder umbenennen.

  • Wenn etwas kaputt geht, lässt es sich am einfachsten reparieren, indem wir es verschieben, anstatt es zu löschen oder umzubenennen:
    mkdir ~/work/oldfiles while read -r file; do sudo mv -- "$file" ~/work/oldfiles/$file; done < files2

  • Wenn Sie sie wirklich löschen möchten (wofür es keinen Grund gibt) (GEFAHR GEFAHR):während lesen -r Datei; mache sudo rm -- "$file"; fertig < Dateien2

Aktualisierung

  • Damit --overwrite funktioniert (was wir tun müssen, damit Pacman erkennt, dass das Paket nicht beschädigt ist), benötigen Sie die folgende Syntax:

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

    • In meinem Fall:sudo pacman -S libidn2 --overwrite /usr/lib/libidn2.so.0
    • Nach dem Beispiel:sudo pacman -S libx000 --overwrite /usr/lib/libx000.so.f.u.loser
  • Ich hatte ein nettes Problem: Wenn ich den symbolischen Link libidn2.so.0 löschte, funktionierte nichts mehr, und als ich ihn wieder einfügte, bekam ich den Fehler „existiert im Dateisystem“. Das Obige mit --overwrite ist alles, was bei mir funktioniert hat.

  • Endlich:

    sudo pacman -Syu

verwandte Informationen