忽略 apt-get 下载错误

忽略 apt-get 下载错误

我正在尝试下载一些软件包以进行离线安装,apt-get download但由于某种原因,apt-rdepends其中包含不存在的软件包。这是我正在使用的命令:

apt-get download $(apt-rdepends libboost1.55-all-dev | grep -v "^ ")

这是我得到的输出:

E: Can't select candidate version from package libstdc++-dev as it has no candidate
E: Can't select candidate version from package debconf-2.0 as it has no candidate
E: Can't select candidate version from package libc-dev as it has no candidate
E: Can't select candidate version from package python-celementtree as it has no candidate
E: Can't select candidate version from package python-elementtree as it has no candidate

apt一直抱怨说有些包没有候选。我想忽略这些错误并下载包及其依赖项。我似乎找不到可以让我忽略错误的标志apt-get。我该怎么做?

答案1

由于apt-rdepends没有提供忽略软件包的方法,因此需要一个包装器来从下载列表中删除无法满足要求的软件包。一种相对便携的自动化方法是使用下面的 BASH 脚本,而无需先安装 Perl/Python 等解释器。

获取依赖项

 #!/bin/bash
 export MAXPARAMETERS=255

 function array_contains_find_index() {
     local n=$#
     local i=0
     local value=${!n}

     for (( i=1; i < n; i++ )) {
         if [ "${!i}" == "${value}" ]; then
             echo "REMOVING $i: ${!i} = ${value}"
             return $i
         fi
     }
     return $MAXPARAMETERS
 }

 LIST=( $( apt-rdepends $1 | grep -v "^ " ) )
 echo ${LIST[*]}
 read -n1 -r -p "... Packages that will be downloaded (Continue or CTRL+C) ..."

 RESULTS=( $( apt-get download ${LIST[*]} |& cut -d' ' -f 8 ) )
 LISTLEN=${#LIST[@]}

 while [ ${#RESULTS[@]} -gt 0 ]; do
     for (( i=0; i < $LISTLEN; i++ )); do
         array_contains_find_index ${RESULTS[@]} ${LIST[$i]}
         ret=$?

         if (( $ret != $MAXPARAMETERS )); then
             unset LIST[$i]
         fi
     done

     FULLRESULTS=$( apt-get download ${LIST[*]} 2>&1  )
     RESULTS=( $( echo $FULLRESULTS |& cut -d' ' -f 11 | sed -r "s/'(.*?):(.*$)/\1/g" ) )
 done

 apt-get download ${LIST[*]}

运行脚本:

 ./getdepends.sh [package name]

我编写的带有更多日志记录功能的注释版本可在 pastebin 上找到:

http://pastebin.com/kj2evSt7

答案2

linux-image-4.13.0-16-generic我刚刚在 artful 上遇到了类似的问题:apt-get download $(apt-rdepends linux-image-4.13.0-16-generic | grep -v "^ ")抱怨没有debconf-2.0。您可以找出哪些软件包提供了此功能:https://packages.ubuntu.com/artful/debconf-2.0。例如,它由debconf包提供。然后你可以使用以下命令修复上述问题:

apt-get download $(apt-rdepends linux-image-4.13.0-16-generic | grep -v "^ " | sed 's/debconf-2.0/debconf/g')

这对我有用。

答案3

这个过程可能对你有用。但源计算机和目标计算机的操作系统应尽可能相同。

1)在源计算机上的某个位置创建下载文件的临时文件夹并输入:

source_comp# mkdir libboost
source_comp# cd libboost

2)获取安装所需包的 http 地址列表:

source_comp# apt-get -y --print-uris install libboost1.55-all-dev | grep "'" | cut -f1 -d' ' | tr -d "'" > packet-list.txt

4)获取构建所需的附加包的列表:

source_comp# apt-get -s build-dep libboost1.55-all-dev | grep "^ " > build-dep.txt

5)获取这些包的http地址列表:

source_comp# apt-get -y --print-uris install `cat build-dep.txt` | cut -f1 -d' ' | tr -d "'" | sort | uniq > build-dep-urls.txt

6)下载所有软件包

source_comp# wget --input-file packet-list.txt
source_comp# wget --input-file build-dep-urls.txt

7) 将源计算机上此文件夹中的所有 deb 文件复制到目标计算机上 apt 档案的默认文件夹(例如,使用 scp):

target_comp# scp user@source_comp:/path_to_libboost/*.deb /var/cache/apt/archives/

并忽略警告和错误来更新本地缓存存储库:

target_comp# apt-get update

8)现在您需要安装构建数据包的所有基础设施:

target_comp# apt-get build-dep libboost1.55-all-dev

9)最后是数据包本身:

target_comp# apt-get install libboost1.55-all-dev

相关内容