下载软件包之前计算所需磁盘空间的方法

下载软件包之前计算所需磁盘空间的方法

以下并非重复如何在使用 apt 下载之前确定软件包的大小?,这更像是一个附加问题。

考虑以下两种实现方式来获取所需的磁盘空间:

#!/bin/bash
echo n | sudo apt-get install $LIST | grep "disk space" | awk '{ print $4, $5 }'

#!/bin/bash

PACKAGE_LIST=$(dpkg --get-selections | awk '{ print $1 }' | grep -v -e "-dbg" | cut -f1 -d":")

getsize () {
   size=$(apt-cache --no-all-versions show $1 | grep Installed-Size | awk '{ print $2 }')
   ((NEEDED+=$size))
}

for package in $LIST; do
   getsize $package
   DEPENDENCIES=$(apt-cache depends $package | grep Depends | awk '{ print $2 }')
   for dependency in $DEPENDENCIES; do
       if [[ ! $PACKAGE_LIST =~ [^.[:alnum:]-]"$dependency"[^.[:alnum:]-] ]]; then
          getsize $dependency
       fi
   done
done

echo "$NEEDED kb"

理论上,它们应该返回类似的结果,但对于大包,$LIST它们返回的结果非常不同,第二个实现返回的结果要大得多(例如 13.5 GB vs 16.2 GB)。我知道第二个实现速度较慢,因为它试图在 bash 中完成 apt-get 的工作,而 bash 的速度要慢得多,但我编写第二个版本的目的是以 kb 为单位获取结果,因为我无法从第一个实现中找到如何以 kb 为单位获取结果,主要是因为 apt-get 将单位从字节缩放到千兆字节,而我不知道它考虑的最大单位是什么。

有人能帮我找出为什么差异这么大吗?

答案1

感谢您的所有意见,我最终得到以下结论:

NEEDED_SPACE_KB=$(echo n | apt-get install $INSTALLABLE_DEBUG_PACKAGES | grep "disk space" | awk '{ print $4, $5 }' | sed 's#GB# * 1000 MB#; s#MB# * 1000 #; s#kB##; s#B# /1000#;' | bc)

答案2

第一个似乎是准确的。

第二个看起来可能考虑到全部依赖项,而不是需要依赖项。

apt-cache depends

显示所有依赖项。

例子:

如果我要安装“potrace”,我只需要“potrace”和“libpotrace0”,但 apt-cache 依赖项列表还会显示“libc6”和“zlib1g”,它们都已安装在我的系统上。

答案3

我认为小数据包不需要输入是或否,也不会显示大小第一次运行脚本后。这就是为什么你的脚本有时可能会花费很长时间并且显示令人困惑的计算。

不管怎样,我编写这个脚本是为了始终获得总大小kB

#!/bin/bash
LIST="openarena chromium-bsu"
echo n | sudo apt-get install $LIST | grep "disk space" | while IFS=, read a b; do echo $b ; done  | 
sed 's/,//g' |
while IFS=\  read a b c; do 
if [ "$b" == "kB" ]; then echo $a $b;
else
 if [ "$b" == "MB" ]; then echo -n $(($a*1024)); echo " kB" 
 fi
fi
 done

生成:

454656 kB

编辑:关于大小的第一句的解释:我的意思是,对于小包(我不记得大小的阈值)apt-get不会询问是或否,因此对于它们来说,echo N对于脚本的下一次运行来说毫无意义,因为apt-get将安装它们,并且只会在第一次运行脚本时显示包大小,其他时候,您运行脚本时,这些小包已经安装,您在计算中遗漏了它们的大小。这部分解释了为什么有时需要很长时间。

相关内容