系统升级过程中出现断电(pacman -Suy
)。所以我有很多破损的包裹。它们似乎在重新安装时通过强制覆盖进行修复(例如pacman -S systemd-sysvcompat--overwrite "*"
)。
所以我的问题是如何对所有损坏的软件包应用重新安装?
答案1
假设您损坏的软件包被报告为丢失文件,您可以使用来Qk
检查软件包(来自man pacman
):
-k,--检查
检查系统上是否存在给定包所拥有的所有文件。如果未指定包或未提供过滤器标志,请检查所有已安装的包。指定此选项两次将为包含所需 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 的参数。使用时,pacman 将绕过与 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
查询文件数据库。此操作允许您查找拥有某些文件的包或显示某些包拥有的文件。仅搜索属于同步数据库一部分的包。请参阅下面的文件选项。