重新安装文件丢失/损坏的软件包

重新安装文件丢失/损坏的软件包

在一次不正常的关闭和一次丰富多彩的 fsck 之后,一大堆文件丢失了。 “rpm -Va”的输出有数百行长(大部分是丢失文件,但也有一些校验和和其他不匹配)。有没有一种简单的方法来重新安装丢失和/或损坏文件的软件包?

有问题的操作系统是 Fedora 22。

答案1

为了参考和完整性,一个能够实现最初要求的命令将是这样的(快速摆弄在一起,但它正在工作)

rpm -qf $(rpm -Va 2>&1 | grep -vE '^$|prelink:' | sed 's|.* /|/|') | sort -u

以下是各个部分的简短说明:

rpm -Va 2>&1

将对 rpm 数据库中当前安装/列出的所有软件包运行完整的验证。它还会将 stderr 重定向到 stdout,因为在我的盒子上,由于启用预链接而导致的一些错误被报告为错误,但我们希望它们出现在 stdout 上。
注意力:需要以 root 身份运行才能检查所有文件、权限和所有者/组。

grep -vE '^$|prelink:'

禁止显示空行和此类预链接错误(此类错误的示例
prelink: /tmp/#prelink#.B14JBi: Recorded 10 dependencies, now seeing -1:)

sed 's|.* /|/|')

将过滤输出rpm -Va以仅显示文件名

rpm -qf $()

将查询所有获得的文件名包含在哪个包中,并输出包名和版本

| sort -u

将抑制重复的包名称/版本组合。

您将总共收到一份未通过验证的软件包列表。

rpm -Va可能仍会显示一些不相关的问题,因为它还会检查包之间的依赖关系,这可能需要通过添加 --nodeps.

答案2

我最近在 openSUSE 13.2 上遇到了类似的文件丢失问题,并用以下方法修复了它:

rpm -Va --nodeps --nodigest --noscripts --nosignature --nofiledigest --nosize --nomode --nordev --nouser --nogroup --nomtime\
| awk -e '($1=="missing") && ($2=="d") {system("rpm -qf "$3);}; ($1=="missing") && ($2!="d") && ($2!="c") {system("rpm -qf "$2);}'\
| sort -u | xargs zypper in -f

就我而言,rpm 选项和 awk 调用旨在节省时间,因为没有发生损坏。

答案3

我在 CentOS 7 上遇到了同样的问题,并通过 @auxsvr 答案的一些自定义来修复它:

rpm -Va --nodeps --nodigest --noscripts --nosignature --nofiledigest --nosize --nomode --nordev --nouser --nogroup --nomtime |egrep 'manque|missing' |awk '$2=="d"{print "rpm -qf "$3}' |sh  |sort -u |xargs yum -y reinstall

相关内容