在系统升级(pacman -Suy
)过程中出现了电源故障。所以我有很多破碎的包裹。他们似乎是固定的重新安装与强制覆盖(例如pacman -S systemd-sysvcompat--overwrite "*"
)。
那么,我的问题是如何将重新安装应用于所有损坏的软件包?
发布于 2021-07-24 15:45:14
假设损坏的包被报告为丢失的文件,则可以使用Qk
检查包(来自man pacman
):
-k,--检查给定包(S)拥有的所有文件是否存在于系统中。如果未指定包或未提供筛选标志,请检查所有已安装的包。两次指定此选项将对包含所需mtree文件的包执行更详细的文件检查(包括权限、文件大小和修改时间)。
因此,这个命令应该给出系统上损坏包的完整列表(下面的示例是my上的结果):
$ 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中使用--覆盖选项.--覆盖选项接受一个包含glob的参数.使用时,pacman将绕过文件冲突检查,查找与glob匹配的文件。在维护得当的系统中,只有在Arch开发人员明确推荐时才应该使用它。请参阅#升级系统前请阅读部分。
当然,在您的情况下,您没有一个适当维护的系统,因为在升级期间的电源故障,所以这可能是一个很好的用例。
发布于 2021-07-24 13:58:58
您可以编写一个脚本,循环遍历所有包并重新安装它们。
只需将当前安装的包列表保存到文本文件中即可。
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
才能首先使脚本可执行
发布于 2021-08-15 21:57:16
这两个答案都是有用的,但它们都不是一个完整的解决方案。
下面的脚本有助于消除这样的错误:
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
查询文件数据库。此操作允许您查找拥有某些文件的包或显示某些包所拥有的文件。只搜索属于同步数据库一部分的包。请参阅下面的“文件选项”。
https://unix.stackexchange.com/questions/659756
复制相似问题