使用 dpkg --set-selections 恢复时出现“软件包不在数据库中”

使用 dpkg --set-selections 恢复时出现“软件包不在数据库中”

我刚刚重新安装了 Ubuntu MATE 15.10。我已遵循这个答案保存已安装软件包的列表并在新安装的系统上恢复它。

然而,当我这样做的时候

sudo dpkg --set-selections < packages-backup.list

我收到一长串错误消息,如下所示:

dpkg: warning: package not in database at line 1417: sqlite3
dpkg: warning: package not in database at line 1417: sqliteman
dpkg: warning: package not in database at line 1417: sqliteman-doc

最后

dpkg: warning: found unknown packages; this might mean the available database is outdated, and needs to be updated through a frontend method

于是我运行了sudo apt-get update一次又一次,dpkg但仍然出现同样的错误。

我似乎对列表中的每个软件包都收到此错误消息,包括默认内核或 sqlite 等相当不起眼的软件包。此外,我在之前的设置中没有添加任何额外的 PPA,因此非默认存储库中的软件包不可能是问题所在。

作为测试,我尝试使用 安装其中一个“有问题的”软件包sudo apt-get install,结果没有任何问题。

这里出了什么问题?

答案1

这些警告可以忽略,因为它们只与dpkg数据库有关。实际安装由 APT 完成,它不使用此数据库。

当您以这种方式使用时dpkg,您需要使用dselect-upgrade以便应用标记的更改。

sudo apt-get dselect-upgrade

来自男人软件包

请注意,如果您不使用 dselect 而使用基于 APT 的前端,则此文件几乎没用:APT 有自己的系统来跟踪可用的软件包。

答案2

尝试这个:

sudo apt-get install dselect && sudo dselect update

之后你可以执行:

sudo dpkg --set-selections < packages-backup.list

答案3

此方法不需要dselect

从 apt 缓存更新 dpkg 数据库:

apt-get update # can skip this
apt-cache dumpavail > /var/cache/apt/available
dpkg --admindir=/var/lib/dpkg --update-avail /var/cache/apt/available

或者使用 root 的单行命令:

dpkg --admindir=/var/lib/dpkg --update-avail <(apt-cache dumpavail)

答案4

以下脚本对我来说是一种解决方法。注意 linux-images 和 linux-headers。如果你的 dpkglist.txt 中有很多这样的文件,那么你可能想要用 grep -v 命令过滤掉它们,比如

 cat dpkglist.txt | grep "$l_mode" | grep -v linux-headers | grep -v linux-image-3 | grep -v linux-image-extra-3 | cut -f1

通过 apt-get 从 dpkglist.txt 安装和卸载软件包的脚本

#!/bin/bash

#
# get the packages
# 
# param 1: l_mode: install or deinstall
#
packages() {
  local l_mode="$1"
  # get the lines for the given mode
  cat dpkglist.txt | grep "$l_mode" |  cut -f1
}

#
# loop over the packages in the given mode
# param 1: l_mode: install or deinstall
#
loop() {
  local l_mode="$1"
  for package in $(packages $l_mode)
  do
    case "$l_mode" in
      install) apt-get -y install $package;;
      deinstall) apt-get -y remove $package;;
    esac
  done
}

# do two loops
loop deinstall
loop install

相关内容