dpkg:警告:无法找到软件包(dpkg -l | grep ^ii | awk '{print $2}' | grep -v xxxx | grep -v xxxx| xargs sudo apt)

一、环境

Ubuntu 16.04 LTS
问题部分解决了,不过写的有点乱,没心情改了

二、状况

安装这卸载软件的时候总是出现dpkg:警告:无法找到软件包****信息。

  • 预期就是解决这个问题。
  • Ubuntu切换工作区间的快捷键[Ctrl+Alt+方向键]

三、探究

这个问题还是有前人处理过的,我们来学习下。
1. dpkg:警告:无法找到软件包 XXXX 问题解决
2. dpkg:警告:无法找到软件包 XXXX 问题解决

3.1、了解下/var/lib/dpkg/info

  1. /var 包含系统一般运行时要改变的数据。通常这些数据所在的目录的大小是要经常变化或扩充的。原来/ v a r目录中有些内容是在/ u s r中的,但为了保持/ u s r目录的相对稳定,就把那些需要经常改变的目录放到/ v a r中了。每个系统是特定的,即不通过网络与其他计算机共享。下面列出一些重要的目录
    * /var/lib存放系统正常运行时要改变的文件。*

  2. 简单的说关于dpkg是一个dpkg是Debian的中级软件包管理器,类似RPM.
    而其中的:/var/lib/dpkg/info”用于保存各个软件包的配置文件列表.
    如果把这个里面的东西全部删除系统并不会瘫痪

  3. 从根本上说我们没有了解到这个/var/lib/dpkg/info路径在apt-get ***一些命令中起到的作用。但是这个过程还是有收获的,就当是预习Ubuntu知识了,不做记录了。

3.2、没头的苍蝇

  • 没头的苍蝇:
    1. http://jingyan.baidu.com/article/b2c186c8e95d1dc46ef6ff0c.html
    2. http://blog.csdn.net/wise622453/article/details/7905253

1.$ sudo mv /var/lib/dpkg/info /var/lib/dpkg/info_old //现将info文件夹更名

2.$ sudo mkdir /var/lib/dpkg/info //再新建一个新的info文件夹

3.$ sudo apt-get update, apt-get -f install

  • 现在尝试安装搜狗输入法看还会不会出现那些错误了。(事实上出现了,所以我们把文章中后面的操作也做了)

4.$ sudo mv /var/lib/dpkg/info/* /var/lib/dpkg/info_old //执行完上一步操作后会在新的info文件夹下生成一些文件,现将这些文件全部移到info_old文件夹下

5.$ sudo rm -rf /var/lib/dpkg/info //把自己新建的info文件夹删掉

6.$ sudo mv /var/lib/dpkg/info_old /var/lib/dpkg/info //把以前的info文件夹重新改回名字

  • 现在尝试卸载在搜狗输入法看是否还会出现警告(再次出现)
  • http://forum.ubuntu.org.cn/viewtopic.php?t=243666

dpkg -l | grep ^ii | awk ‘{print $2}’ | grep -v xxxx | grep -v xxxx| xargs sudo aptitude reinstall

  • 做出解释:

    1. “|”管道
    2. dpkg -l:显示已经安装的软件包列表。
    3. grep ^ii:筛选显示处于 ii状态的已安装软件包列表。
    4. awk ‘{print $2}’:仅仅打印软件的名字。
      • dpkg -l | grep ^ii | awk ‘{print $2}’ 仅用这个命令得到的是一系列已经安装的软件名字
    5. 而 xargs sudo aptitude reinstall 的作用是对 dpkg -l | grep ^ii | awk ‘{print $2}’ | grep -v xxxx | grep -v xxxx| 筛选出来的软件进行重新安装
    6. grep -v packageName 此命令:举个例子,如果 dpkg -l | grep ^ii | awk ‘{print $2}’ 得到的结果是 软件1,软件2,软件3但我们并不希望 软件3 重新安装 整个命令就应该是:
      dpkg -l | grep ^ii | awk ‘{print $2}’ | grep -v 软件3| xargs sudo aptitude reinstall
  • dpkg:警告:无法找到软件包(dpkg -l | grep ^ii | awk '{print $2}' | grep -v xxxx | grep -v xxxx| xargs sudo apt)_第1张图片

    • 期望状态=未知(u)/安装(i)/删除(r)/清除(p)/保持(h)
      | 状态=未安装(n)/已安装(i)/仅存配置(c)/仅解压缩(U)/配置失败(F)/不完全安装(H)/触发器等待(W)/触发器未决(T)
      |/ 错误?=(无)/须重装(R) (状态,错误:大写=故障)
    • 结合图片应该把这三行内容结合分析
    • 第一个i表示用户期望软件的状态是安装
    • 第二个i表示软件的实际状态是已安装
    • 第三个空格表示无误
    • 总结:“ii ”表示用户期望安装的软件处于正确的安装状态。
    • dpkg包管理器ii、rc含义

其中“grep -v xxxx”为需要排除的包。

例如,用户是在网站上下载的opera的deb包安装的opera,这时是修复的时候,系统可能出现如下提示:
E: 我无法找到对应 opera 软件包的文件。在这种情况下您可能需要手动修正这个软件包。
正在编辑扩展状态信息… 完成
E: 我无法找到对应 opera 软件包的文件。在这种情况下您可能需要手动修正这个软件包。
E: 内部错误:无法生成下载软件包列表
xargs: sudo:以状态 255 退出;中止

这时只要把提示的包名称输入在“grep -v xxxx”里替换掉“X”就可以,就像这样:
dpkg -l | grep ^ii | awk ‘{print $2}’ | grep -v opera | xargs sudo aptitude reinstall

如果还有上面的提示,但是包的名称不同,就在后面再加一个“| grep xxx”
以包”benliud”为例:
dpkg -l | grep ^ii | awk ‘{print $2}’ | grep -v opera | grep -v benliud | xargs sudo aptitude reinstall
以此类推。

不过我的问题是我没有出现:

E: 我无法找到对应 opera 软件包的文件。在这种情况下您可能需要手动修正这个软件包。
正在编辑扩展状态信息… 完成
E: 我无法找到对应 opera 软件包的文件。在这种情况下您可能需要手动修正这个软件包。
E: 内部错误:无法生成下载软件包列表
xargs: sudo:以状态 255 退出;中止

—当前还是不知道要怎么处理呢。


四、解决

我最终通过 dpkg -l | grep ^ii | awk ‘{print $2}’ | grep -v xxxx | grep -v xxxx| xargs sudo aptitude reinstall 命令部分解决了我的问题。
值得注意的是这个命令并不是防止四海皆准的
使用步骤可以是这样的
dpkg -l | grep ^ii | awk '{print $2}' | xargs sudo aptitude reinstall
如果提示
E: 没有源可以用来下载 5.1.6~rc2-0ubuntu1~xenial1 版本的 uno-libs3:amd64
可以修改为
dpkg -l | grep ^ii | awk '{print $2}' | xargs sudo | grep -v uno-libs3 | aptitude reinstall
再次运行就再次添加
dpkg -l | grep ^ii | awk '{print $2}' | xargs sudo | grep -v uno-libs3 | grep -v ^libreoffice | aptitude reinstall
我的最终命令是:

dpkg -l | grep ^ii | awk '{print $2}' | grep -v uno-libs3 | grep -v ^libreoffice | grep -v account-plugin-facebook | grep -v account-plugin-flickr | grep -v  libaccount-plugin-google | grep -v  account-plugin-google | grep -v fonts-opensymbol | grep -v libaccount-plugin-1.0-0 | grep -v libaccount-plugin-generic-oauth | grep -v libicu55 |grep -v netease-cloud-music| grep -v python3-uno | grep -v sogoupinyin | grep -v unattended-upgrades | grep -v unity-control-center-signon | grep -v ure |  xargs  aptitude reinstall

中间失败过我就又重新运行了这个命令两遍。结果很可观。
从前我的错误有1900+条

dpkg:警告:无法找到软件包
……
执行上述命令后
错误就只有一屏幕了

最新的问题是对于这些剩余的dpkg:警告:无法找到软件包,再次逐条执行 aptitude reinstall packageName 会提示:

E: 没有源可以用来下载 xxx 版本的 xxx

好在效果还是有的。

参考

不妨读一下
1. Linux 各目录及每个目录的详细介绍
2. Linux 各目录及每个目录的详细介绍 /var文件系统
3. ubuntu APT-GET工作原理
4. ubuntu APT-GET工作原理

  1. http://www.iteye.com/topic/138041
  2. apt-get 命令详解
  3. dpkg的介绍及命令使用
  4. 富有指导意义,但是尚不能找到重点

有待处理

  1. Linux方便的跳墙方式。
  2. Debian
  3. 清空控制台

你可能感兴趣的:(Linux)