0%

解决 Ubuntu18.04 的 dpkg warning files list file for package 'XXXXXXX' missing, assuming package has no files currently installed bug

多人使用节点总会有这有那的问题,毕竟每个人都有 sudo 权限,每个人都会装软件,每个人都会改配置文件,有人不遵守游戏规则瞎改配置文件就会出问题。

*Photo by Tim Gouw on Unsplash

前言

不知道是谁动了服务器,导致环境不对了,gcc/g++ 使用报错,找不到头文件,以及每次使用 apt 都会输出标题的 warning,后来在粘贴到 txt 文档发现有多达 180 个 warning,真的服气,找了很多方案都没用,比如删除 /var/lib/dpkg/info 然后自动生成,可能对那个博主有用,但是对我无效,最后这个:Ubuntu 18.04中的Dpkg警告解决方案,简单而粗糙 有用,稍微修改整理了下,于是有了这篇博客。

解决方法

他博客里面写需要新建三个文件,其实只需要两个文件,因为最后一个 Shell 脚本是自动生成的。

错误信息的文档

第一个就是包含 warning 的文本文档,我将其命名为 dpkg_warning.txt,然后将所有信息复制到这个文本中,大概如下:

1
2
3
4
5
6
dpkg: 警告: 无法找到软件包 libc++abi1:amd64 的文件名列表文件,现假定该软件包目前没有任何文件被安装在系统里。
dpkg: 警告: 无法找到软件包 vdpau-driver-all:amd64 的文件名列表文件,现假定该软件包目前没有任何文件被安装在系统里。
dpkg: 警告: 无法找到软件包 libgsasl7:amd64 的文件名列表文件,现假定该软件包目前没有任何文件被安装在系统里。
dpkg: 警告: 无法找到软件包 libpgm-5.2-0:amd64
...
dpkg: 警告: 无法找到软件包 libnppial9.1:amd64 的文件名列表文件,现假定该软件包目前没有任何文件被安装在系统里。

用于生成 Shell 的 Python 脚本

这个 Python 脚本的主要作用就是从上面的 txt 文档中提取出软件名,然后生成一条对应的重装命令,并写入 Shell 脚本,这个脚本我也做了修改,我去掉了软件名后面挂的 amd64,原博客是没去的,​但是好像没影响。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
# @Date : 2020-10-06 15:00:41
# @Author : Lewis Tian (taseikyo@gmail.com)
# @Link : github.com/taseikyo
# @Version : python3.8

"""
遇到这个问题,找了很多都没解决
这个链接似乎有效

- https://www.pythonf.cn/read/105362
"""

import re


def main():
pat = re.compile("dpkg: 警告: 无法找到软件包 (.+) ")
miss_pkgs = []
for line in open("dpkg_warning.txt", encoding="utf-8"):
pkg = re.match(pat, line)
if pkg:
miss_pkgs.append(pkg.group(1).split(":")[0])
with open("fix.sh", "w") as f:
f.write("#!/bin/bash\n\n")
for mpkp in miss_pkgs:
f.write(f"sudo apt-get -y install --reinstall {mpkp}\n")


if __name__ == "__main__":
main()

执行 Shell 脚本

从上面的 Python 脚本中可以看到,最后的 Shell 脚本为 fix.sh,我们将其传到服务器上,由于是在 Windows 上写的文件,放到 Linux 上会由于换行存在问题,用 vim 打开,输入命令将换行转成 Linux 的格式。最后给脚本加上可执行的权限,最后运行即可。

1
2
3
4
5
vim fix.sh
# :set fileformat=unix
# :wq
sudo chmod +x fix.sh
./fix.sh

在执行过程中可以看到 warning 仍然存在,但是个数在不断减少,当执行到最后一条命令时,不出意外 warning 应该没了。

参考

Welcome to my other publishing channels