Error de pacman "existe en el sistema de archivos"

Error de pacman "existe en el sistema de archivos"

Ejecuté sudo pacman -Syuy obtuve algunos errores interesantes al leer:

error: no se pudo confirmar la transacción (archivos en conflicto)

y una larga lista de archivos seguidos de exists in filesystem. El resultado completo está aquí:http://ix.io/lLw

Parece que muchos de estos archivos no están asociados con un paquete cuando los revisé con pacman -Qo <path-to-file>, pero no los revisé todos. Tenía una conexión débil cuando ejecuté pacman -Syu, pero recibo los mismos errores cuando actualicé más tarde:http://ix.io/lLx

¿Qué tengo que hacer? ¿Debo revisar todos los archivos y eliminar los que no tienen un paquete asociado? ¿Debo forzar la actualización (con sudo pacman -S --force <package-name>?)

Actualizar

Intenté ejecutar sudo pacman -S --force <package-name>y obtuve esto:

[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

Parece que pacman -S --force <packageno sobrescribe los directorios que contienen archivos. Del hombre:

El uso de --force no permitirá sobrescribir un directorio con un archivo ni instalar paquetes con archivos y directorios en conflicto.

¿Debería simplemente eliminar los directorios en conflicto? (no tienen paquetes asociados)

Respuesta1

Después de que pacman finalmente desaprobó la --forceopción e hizo que la --overwriteopción sustituta funcionara como se esperaba, se debe tener en cuenta el siguiente patrón de uso.

Un comando para reproducir la --forceopción que sobrescribe ciegamente cualquier cosa que entre en conflicto es este:

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

O

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

La parte complicada es escapar del comodín para evitar que el shell lo expanda primero.

Respuesta2

Ok, parece que la ejecución sudo pacman -S --force <package-name>funciona, pero no resuelve directorios en conflicto. En tales casos, se ejecuta sudo rm -rfen los directorios en conflicto, seguido de sudo pacman -S --force <package-name>obras.

Ahora mi pacman -Syuresolución bien.

Respuesta3

tl;dr: desinstale la aplicación en conflicto antes de ejecutarla pacman.

pacman(y otros administradores de paquetes) mantienen uníndice de paquetes y archivosque manejan ( pacman --query --list). Algunos archivos, como los de configuración, se marcarán como modificables y no se sobrescribirán durante la actualización (excepto en circunstancias especiales, donde el administrador de paquetes normalmente eliminará el archivo antiguo antes de crear uno nuevo). Otros archivos se marcarán como no modificables.Si otra aplicación cambia esos archivos de alguna manera sin actualizar el índice en consecuencia, el administrador de paquetes no tiene forma de saber qué hacer con esos archivos durante una actualización.

Muchas aplicaciones instaladas usando el ./configure && make && sudo make installpatrón estándar se pueden desinstalar usandosudo make uninstall. Si ha instalado la aplicación de alguna otra manera, es posible que tenga que hacer algo más para desinstalarla. En general puede ser una buena ideaconservar una copia de los archivos de instalaciónen algún lugar (por ejemplo ~/install) para poder desinstalarlos de manera confiable en tales casos. Simplemente eliminar los archivos conflictivos probablemente dejará otros archivos por ahí, lo que posiblemente podría causar otros problemas.

Al instalar software con otros administradores de paquetes, hay formas de aislarlos de los archivos del sistema. Esta es una mejor práctica establecida, por ejemplo, durante el desarrollo de software, donde realmente desea mantener las versiones consistentes y evitar conflictos con otro software. Ejemplos incluyen:

Respuesta4

TLDR;

  1. Obtenga una lista de los archivos infractores (copie y pegue la salida de pacman en un archivo).
  2. Usarawkpara eliminar todo menos las rutas de los archivos en una nueva lista.
  3. Usarmientraspara quitar del camino los archivos infractores, según la lista.
  4. Corre sudo pacman -Syude nuevo.

    editado para agregar TLDR y corregir errores tipográficos

Aunque estoy bastante seguro de que no he estado haciendo nada estúpido, he tenido este problema tal vez cada dos veces que intenté actualizar desde que uso Manjaro; tres o cuatro veces en dos meses. El punto es que esto lo soluciona.

Obtenga una lista de sus archivos.

Cuando la actualización falla en la ventana de su terminal, obtiene esto:

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

... y mucho más.

  • Copie la salida del terminal y colóquela en un archivo. solíanano, y llamé a los míos "archivos", como en~/trabajo/archivos.

  • Elimina información extraña:

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

    Esto toma la segunda "palabra" de cada línea y la imprime en archivos2.

Ocuparse de los archivos

  • Puede eliminarlos, moverlos o cambiarles el nombre.

  • Si algo se rompe, es más fácil arreglarlo si lo rompemos moviéndolo en lugar de eliminarlo o cambiarle el nombre:
    mkdir ~/work/oldfiles while read -r file; do sudo mv -- "$file" ~/work/oldfiles/$file; done < files2

  • Si realmente desea eliminarlos, lo cual no hay motivo para hacerlo (PELIGRO PELIGRO):mientras lee el archivo -r; hacer sudo rm -- "$archivo"; hecho <archivos2

Actualizando

  • Para que --overwrite funcione, lo cual debemos hacer para que pacman se dé cuenta de que el paquete no está roto, necesita la siguiente sintaxis:

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

    • En mi caso:sudo pacman -S libidn2 --overwrite /usr/lib/libidn2.so.0
    • Siguiendo el ejemplo:sudo pacman -S libx000 --overwrite /usr/lib/libx000.so.f.u.loser
  • Tuve un lindo problema en el que si eliminaba el enlace simbólico libidn2.so.0, nada funcionaba y cuando lo volvía a colocar, recibía el error "existe en el sistema de archivos". Lo anterior, con --overwrite, es todo lo que funcionó para mí.

  • Finalmente:

    sudo pacman -Syu

información relacionada