Package installation says FILENAME exists in filesystem; “Failed to commit transaction (conflicting files)”

I can't install or update a package because I get (something like) this:

error: could not prepare transaction
error: failed to commit transaction (conflicting files)
libname: /insert/file/name/here exists in filesystem
Errors occurred, no packages were upgraded.

Why is this happening?

The package manager, pacman , has detected an unexpected file already exists on disk. By design it will not overwrite files that already exist. This is a design feature, not a flaw - package managers are designed to keep track of installed files.

This issue normally happens because you've manually added, copied, or created a file. It can also happen when you install software using a downloaded executable, run a make install , or use a third-party package system such as conda . It also occurs when you install an AUR package which installs files that conflict with a repo package.

When using a third-party installer you should always specify an alternative installation location, such as under your home directory, or under /opt or /usr/local/ . Never install directly under / or /usr .

How can I fix this?

The better way

The first step is to identify which, if any, package owns the file. This can be easily done with:

pacman -Qo /path/to/file

If this identifies a conflicting package you can decide to remove it with pacman -R . If no package is identified you can delete the file, e.g. rm /path/to/file (or move it to a backup location, e.g. mv /path/to/file /path/to/file.backup ).

The faster way

pacman has an --overwrite option which will allow it to overwrite files. If you are sure you want to, you can tell it to

sudo pacman -S $PACKAGE --overwrite path/to/*

This will (re)install the $PACKAGE and overwrite any files under the directory path/to/

This can be very useful if your local database has "lost" a package you've already installed (and so every file in the package "conflicts").

The "I don't care" way

sudo pacman -S $PACKAGE --overwrite '*'

Example

Here's an example of how to decide what to write:

So the command could be:

sudo pacman -S languagetool --overwrite usr/bin/languagetool,usr/share/java/languagetool/*

Where can I read more?

This post was inspired by (and adapted from):

https://bbs.archlinux.org/viewtopic.php?id=56373

The above post also has links to further reading.

3 Likes