Следующее не является дубликатом Как определить размер пакета при использовании 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 ГБ против 16,2 ГБ). Я знаю, что вторая реализация медленнее, потому что она пытается выполнить работу apt-get в bash, что намного медленнее, но я намеревался написать вторую версию, чтобы получить результат в kb, потому что я не мог узнайте, как получить результат в килобайтах из первой реализации, главным образом потому, что apt-get масштабирует единицу, от байтов до гигабайт, и я не знаю, какую самую большую единицу он считает.
Может ли кто-нибудь помочь мне выяснить, почему существует такая большая разница?
Первое, кажется, точно.
второй походит на него, мог бы рассматривать размер весь , зависимостям вместо было нужно зависимости.
apt-cache depends
поднимает все зависимости.
Пример:
, Если бы я должен был установить "potrace", мне только были бы нужны "potrace" и "libpotrace0", но список зависимостей от способного кэша зависит, также поднимает "libc6" и "zlib1g", которые оба уже установлены в моей системе.
Спасибо за весь вход я закончил со следующим:
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)
Я предполагаю, что небольшие пакеты не просят относительно входа у Да или No и не показывают с размером после первого выполнения сценария . Вот почему Ваш сценарий, вероятно, может иногда занимать много времени и выставочное вычисление путания.
Так или иначе я записал этот сценарий для получения всегда общего размера в 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
не спрашивает fro Да или нет, таким образом, для них echo N
бессмысленно для следующие разы сценария, работает, потому что apt-get
установит их, и это покажет размеру пакета только первый раз выполнения сценария, другие времена, Вы выполняете сценарий, так мало пакетов уже установлено и Вы пропускаете их размер в вычислении. Это - частично ответы, почему это иногда занимает много времени.