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

TLDR;

  1. 問題のあるファイルのリストを取得します (pacman の出力をファイルにコピーして貼り付けます)。
  2. 使用awkファイルパス以外のすべてを新しいリストに削除します。
  3. 使用その間リストに基づいて、問題のあるファイルを移動します。
  4. 再実行sudo pacman -Syu

    TLDRを追加し、タイプミスを修正しました

自分が愚かなことをしているわけではないと確信していますが、Manjaro を使い始めてからアップデートを試みるたびに、おそらく 2 か月以内に 3 回か 4 回、この問題に遭遇しています。つまり、これで問題は解決します。

ファイルのリストを取得します。

ターミナル ウィンドウで更新が失敗すると、次のメッセージが表示されます。

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

    これは各行から 2 番目の「単語」を取得し、それを 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 シンボリックリンクを削除すると何も機能せず、それを元に戻すと「ファイルシステム上に存在します」というエラーが発生するという、厄介な問題がありました。上記の --overwrite を使用した方法だけが、私にとってはうまくいきました。

  • ついに:

    sudo pacman -Syu

関連情報