システムのアップグレード中に停電が発生しました(pacman -Suy
)。だから、破損したパッケージがたくさんあります。再インストール時に強制的に上書きすると問題が解決するようです(例pacman -S systemd-sysvcompat--overwrite "*"
:)。
だから私の質問は、破損したすべてのパッケージに再インストールを適用する方法です。
答え1
破損したパッケージが見つからないファイルとして報告されていると仮定すると、Qk
(で)を使用してパッケージを確認できますman pacman
。
-k、--確認
そのパッケージが所有するすべてのファイルがシステムに存在することを確認してください。パッケージが指定されていない場合、またはフィルタフラグが指定されていない場合は、インストールされているすべてのパッケージを確認してください。このオプションを2回指定すると、必要なmtreeファイルを含むパッケージに対してより詳細なファイルチェック(権限、ファイルサイズ、および変更時間を含む)が実行されます。
したがって、このコマンドはシステムで破損したパッケージの完全なリストを提供する必要があります(以下の例は私のArchの結果です)。
$ pacman -Qk 2>/dev/null | grep -v ' 0 missing files'
at: 45 total files, 1 missing file
audit: 196 total files, 4 missing files
bind: 413 total files, 3 missing files
blueman: 791 total files, 1 missing file
gdm: 501 total files, 6 missing files
gnome-perl: 71 total files, 18 missing files
gnome-vfs-perl: 61 total files, 27 missing files
gnomecanvas-perl: 39 total files, 17 missing files
gvfs: 324 total files, 1 missing file
hplip: 2294 total files, 72 missing files
mariadb: 354 total files, 1 missing file
nfs-utils: 111 total files, 3 missing files
perl-goo-canvas: 59 total files, 18 missing files
perl-gtk2-imageview: 36 total files, 19 missing files
perl-term-shellui: 21 total files, 6 missing files
polkit: 201 total files, 1 missing file
samba: 976 total files, 1 missing file
syslinux: 237 total files, 2 missing files
systemd: 1891 total files, 1 missing file
これにより、このコマンドはパッケージ名のみを印刷します。
$ pacman -Qk 2>/dev/null | grep -v ' 0 missing files' | cut -d: -f1
at
audit
bind
blueman
gdm
gnome-perl
gnome-vfs-perl
gnomecanvas-perl
gvfs
hplip
mariadb
nfs-utils
perl-goo-canvas
perl-gtk2-imageview
perl-term-shellui
polkit
samba
syslinux
systemd
リストを繰り返して再インストールできます。
pacman -Qk 2>/dev/null | grep -v ' 0 missing files' | cut -d: -f1 |
while read -r package; do
pacman -S "$package" --overwrite "*" --noconfirm
done
または、リストが長すぎない場合は、次のようにすることもできます。
pacman -S "$(pacman -Qk 2>/dev/null | grep -v ' 0 missing files' | cut -d: -f1)" \
--overwrite "*" --noconfirm
私が持っているので参考にしてくださいいいえこれをテストしましたが、このコマンドがパッケージを変更していることをあなたの言葉を受け入れます。sudo pacman -Qkk 1>/dev/null 2>&1 | grep checksum
提案どおりに実行して、誤って変更されたファイルを確認することもできます。タンジェンコメントに。
最後に、Archドキュメントではこの--overwrite
オプションを使用しないように警告しています。ベンモールド犬コメントでこの点を指摘してください):
通常、pacmanで--overwriteオプションを使用しないでください。 --overwrite オプションは glob を含む引数を使用します。パックマンを使用すると、globと一致するファイルのファイル競合チェックをバイパスします。適切に管理されているシステムでは、Arch開発者が明示的に推奨する場合にのみ使用してください。より#システムアップグレード前に必ずお読みください部分。
もちろん、お客様の場合、アップグレード中に停電が発生したため、システムを適切に保守できないため、これは良いユースケースになる可能性があります。
答え2
すべてのパッケージを繰り返して再インストールするスクリプトを作成できます。
現在インストールされているパッケージのリストをテキストファイルとして保存するだけです。
pacman -Qq > packages.txt
スクリプトを作成します。
nano reinstall.sh
#!/bin/bash
for package in $(cat packages.txt)
do
pacman -S $package --overwrite "*" --noconfirm
done
後で実行できます
sudo sh reinstall.sh
メモ:chmod a+x reinstall.sh
スクリプトを実行可能にするには、次のように入力する必要があります。
答え3
どちらの答えも便利ですが、どちらも完全な解決策ではありません。
次のスクリプトは、これらのエラーを削除するのに役立ちます。
ldconfig: File /usr/lib/libsvn_repos-1.so is empty, not checked.
スクリプト:
LANG=en_EN ldconfig 2> err.txt
for file in $(cut -d" " -f3 err.txt)
do
echo $file
pacman -S $(pacman -Fq $file) --noconfirm --overwrite "*"
done
ファイルデータベースを照会します。これにより、特定のファイルを所有するパッケージを検索したり、特定のパッケージが所有するファイルを表示したりできます。同期データベースの一部であるパッケージのみを検索します。以下のファイルオプションを参照してください。