Error de pacman "existe en el sistema de archivos"

38

Corrí sudo pacman -Syuy obtuve algunos errores interesantes al leer:

error: error al confirmar la transacción (archivos en conflicto)

y una larga lista de archivos seguidos de exists in filesystem. La salida completa está aquí: http://ix.io/lLw

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

¿Qué tengo que hacer? ¿Debo verificar 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é correr 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 pacman -S --force <packageque no sobrescribe los directorios que contienen archivos. Del hombre:

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

¿Debo eliminar los directorios en conflicto? (no tienen paquetes asociados)

modulitos
fuente
55
¿Por qué tienes archivos en conflicto en primer lugar? cuando use un administrador de paquetes, trate de no tocar los dedos de los pies (por ejemplo, instalando software en lugares que el administrador de paquetes piense que es suyo; si debe instalar las cosas manualmente, instálelo en /usr/local/lugar de /usr/)
umläute
1
@ umläute No estoy exactamente seguro de dónde provienen los archivos en conflicto, pero sospecho que están relacionados con mi instalación de docker-compose que instalé usando sudo pip install -U docker-compose==1.5.0rc3 en esta página . Quizás sudo pip installconflictos con pacman?
modulitos
2
@ umläute Obtener -Sactualizaciones incorrectas (instalaciones parciales, etc.) le permitirá ese escenario. Caso de mí --forcetrabajó todo el tiempo.
m3nda

Respuestas:

28

Ok, parece que 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>trabajos.

Ahora mi pacman -Syuresuelve bien.

modulitos
fuente
66
--force está en desuso; use --overwrite en su lugar.
Ankit Balyan
77
--force está trabajando para mí pero
overwrite
3
sudo pacman -Syu --forcefuncionó para mí, pero sobrescribir no fue reconocido.
spydon
21

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

pacman(y otros administradores de paquetes) mantienen un índice de paquetes y archivos que administran (pacman --query --list ). Algunos archivos, como la 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 generalmente alejará el archivo anterior antes de crear el 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, no hay forma de que el administrador de paquetes sepa qué hacer con esos archivos durante una actualización.

Muchas aplicaciones instaladas con el ./configure && make && sudo make installpatrón estándar se pueden desinstalar usando sudo make uninstall. Si ha instalado la aplicación de alguna otra manera, puede que tenga que hacer algo más para desinstalarla. En general, puede ser una buena idea conservar una copia de los archivos de instalación algún lugar (por ejemplo ~/install) para poder desinstalarlos de manera confiable en tales casos. Simplemente eliminar los archivos en conflicto 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 práctica recomendada establecida, por ejemplo, durante el desarrollo de software, donde realmente desea mantener las versiones consistentes y evitar conflictos con otro software. Ejemplos incluyen:

l0b0
fuente
2
Vea mi comentario a @umlaute arriba. Creo que el conflicto fue de un sudo pip installcomando. ¿Quizás debería evitar usar pip con sudo?
Modulitos
3

Estaba instalando paquetes que generalmente instalo con pip a través de pacman debido a esto. Pero algunos paquetes no se encuentran en repositorios pacman. Creo que deberíamos evitar instalar pip con privilegios de sudo y, en cambio:

pip install pillow --user

- La marca de usuario hace paquetes de instalación de pip en su directorio de inicio, que no requiere ningún privilegio especial. https://stackoverflow.com/questions/42988977/what-is-the-purpose-pip-install-user

lava-lava
fuente
2

TLDR;

  1. Obtenga una lista de los archivos ofensivos (copie y pegue la salida de pacman en un archivo).
  2. Use awk para eliminar todo menos las rutas de los archivos en una nueva lista.
  3. Use while para mover los archivos ofensivos fuera del camino, según la lista.
  4. Corre de sudo pacman -Syunuevo.

    editado para agregar TLDR y corregir errores tipográficos

Aunque estoy bastante seguro de que no he estado haciendo nada estúpido, tal vez he tenido este problema cada vez que he intentado actualizar desde que uso Manjaro; tres o cuatro veces en dos meses. Punto de ser, esto lo arregla.

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 el resultado del terminal y póngalo en un archivo. Usé nano , y llamé a los "archivos" míos, como en ~ / work / files .

  • Tira 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.

Lidiar con los archivos

  • Puede eliminarlos, moverlos o cambiarles el nombre.

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

  • Si realmente desea eliminarlos, no hay razón para hacerlo ( PELIGRO PELIGRO ): mientras lee el archivo -r; do sudo rm - "$ archivo"; hecho <archivos2

Actualización

  • Para que --overwrite funcione, lo que 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 colocar, recibí el error "existe en el sistema de archivos". Lo anterior, con --overwrite, es todo lo que funcionó para mí.

  • Finalmente:

    sudo pacman -Syu

Fin Hirschoff
fuente
2

Después de que pacman finalmente desactive la --forceopción y haga que la --overwriteopción sustituta funcione como se espera, se debe tener en cuenta el siguiente patrón de uso.

Un comando equivalente para reproducir la --forceopción que sobrescribe ciegamente cualquier conflicto será:

sudo pacman -S --overwrite \*

O

sudo pacman -S --overwrite "*"

La parte difícil es escapar del globo para evitar que el caparazón lo expanda primero.

nada
fuente
Esto funciona perfectamente, gracias!
EkriirkE
0

Si tienes muchos archivos como yo,

sudo pacman --force -Syyu  

resuelve todos los problemas.

Mohamed Hedi Kestouri
fuente
la opción --force está en desuso; use --overwrite en su lugar
Mahmoud Khaled
- Overwrite parece que debe especificar qué sobrescribir. Actualmente uso
fuerza