Как получить размер (в мегабайтах) всех пакетов обновления?

Итак, для проекта как части работать, мне нужно получить размер обновления Linux.

Я использовал команду:

aptitude search -SF '%p' --disable-columns '~U'

Итак, я получаю имена пакетов, которые нужно обновить, но мне нужен только размер скрипта. Я могу использовать apt или aptitude для Ubuntu, Debian и у меня то же самое, что и с yum для Centos, RedHat.

Я немного искал в команде man , но не могу найти то, что мне нужно. Если кто-нибудь может мне помочь? Я думал, что это будет просто, но, может быть, я что-то упустил.

1
задан 12 July 2021 в 13:36

2 ответа

Вы можете добиться этого, выполнив следующие шаги:

Сначала установите пакет apt-show-versions на машину с помощью:

sudo apt-get install -y apt-show-versions

С помощью следующей команды вы можете получить список пакетов которые можно обновить:

apt-show-versions -u

Это может быть использовано в наших интересах, объединив этот инструмент с apt-cache для восстановления размера пакета, давайте посмотрим, как это делается:

for package in `/usr/bin/apt-show-versions -u | tr ' ' / | cut -f1,6 -d'/' | tr / =` ; do echo -n $package ; sudo apt-cache show $package | grep '^Size:' | cut -d: -f2 ; done | sort -k2 -n

Предыдущая команда будет предоставит вам список обновляемых пакетов и их размер в байтах в возрастающем порядке.

Если вы хотите понять, что делается на каждом шаге, вот краткое описание приведенной выше команды:

# Gives you a list of upgradable packages with their new available versions in format package_name=version
/usr/bin/apt-show-versions -u | tr ' ' / | cut -f1,6 -d'/' | tr / =

# Get the size (in bytes) of each package that is upgradable
sudo apt-cache show $package | grep '^Size:'

# Display the output in ascending order
sort -k2 -n 

Пример вывода предыдущей команды:

galoget@hackem:~$ for package in `/usr/bin/apt-show-versions -u | tr ' ' / | cut -f1,6 -d'/' | tr / =` ; do echo -n $package ; sudo apt-cache show $package | grep '
^Size:' | cut -d: -f2 ; done | sort -k2 -n

initramfs-tools:all=0.136ubuntu6.6 9248
systemd-sysv:amd64=245.4-4ubuntu3.7 10280
software-properties-common:all=0.98.9.5 10616
initramfs-tools-bin:amd64=0.136ubuntu6.6 10904
update-manager-core:all=1:20.04.10.7 11260
python-apt-common:all=2.0.0ubuntu0.20.04.5 17052
linux-base:all=4.5ubuntu3.6 17780
libasound2-data:all=1.2.2-2.1ubuntu2.4 20040
ubuntu-release-upgrader-core:all=1:20.04.33 23812
python3-software-properties:all=0.98.9.5 25124
alsa-ucm-conf:all=1.2.2-1ubuntu0.8 26484
systemd-timesyncd:amd64=245.4-4ubuntu3.7 28104
libprocps8:amd64=2:3.3.16-1ubuntu2.2 33016
libnetplan0:amd64=0.102-0ubuntu1~20.04.2 34608
libpam-runtime:all=1.3.1-5ubuntu4.2 37276
python3-update-manager:all=1:20.04.10.7 38176
libpam-modules-bin:amd64=1.3.1-5ubuntu4.2 41180
initramfs-tools-core:all=0.136ubuntu6.6 47744
libxmlb1:amd64=0.1.15-2ubuntu1~20.04.1 50520
libpam0g:amd64=1.3.1-5ubuntu4.2 55372
libudev1:amd64=245.4-4ubuntu3.7 77604
libnss-systemd:amd64=245.4-4ubuntu3.7 96096
python3-distupgrade:all=1:20.04.33 104100
netplan.io:amd64=0.102-0ubuntu1~20.04.2 117380
update-notifier-common:all=3.192.30.8 132392
python3-apt:amd64=2.0.0ubuntu0.20.04.5 154164
libpam-systemd:amd64=245.4-4ubuntu3.7 185812
apt-utils:amd64=2.0.6 216244
procps:amd64=2:3.3.16-1ubuntu2.2 232168
sosreport:amd64=4.1-1ubuntu0.20.04.2 245052
libpam-modules:amd64=1.3.1-5ubuntu4.2 260364
libsystemd0:amd64=245.4-4ubuntu3.7 270248
open-iscsi:amd64=2.0.874-7.1ubuntu6.2 283160
tmux:amd64=3.0a-2ubuntu0.3 292044
libasound2:amd64=1.2.2-2.1ubuntu2.4 334416
cloud-init:all=21.2-3-g899bfaa9-0ubuntu2~20.04.1 456404
open-vm-tools:amd64=2:11.2.5-2ubuntu1~ubuntu20.04.1 603812
openssl:amd64=1.1.1f-1ubuntu2.4 620068
libapt-pkg6.0:amd64=2.0.6 835288
ubuntu-advantage-tools:amd64=27.1~20.04.1 837368
apt:amd64=2.0.6 1295960
libssl1.1:amd64=1.1.1f-1ubuntu2.4 1319180
udev:amd64=245.4-4ubuntu3.7 1366316
systemd:amd64=245.4-4ubuntu3.7 3805892
snapd:amd64=2.49.2+20.04 30555628

Если вам нужен только размер пакетов и добавить их, чтобы получить общий размер в байтах, вы можете использовать следующую команду:

galoget@ip-172-31-35-106:~$ for package in `/usr/bin/apt-show-versions -u | tr ' ' / | cut -f1,6 -d'/' | tr / =` ; do sudo apt-cache show $package | grep '^Size: ' | cut -d " " -f2 ; done | sort -k2 -n | awk '{ SUM += $1} END { print SUM }'

45245756

В моем примере общий размер обновления будет 45245756 байтов, что составляет 45,3 мегабайта , это можно проверить, запустив:

galoget@hackem:~$ sudo apt upgrade

Reading package lists... Done
Building dependency tree       
Reading state information... Done
Calculating upgrade... Done
The following NEW packages will be installed:
  distro-info
The following packages will be upgraded:
  alsa-ucm-conf apt apt-utils cloud-init initramfs-tools initramfs-tools-bin initramfs-tools-core libapt-pkg6.0 libasound2 libasound2-data libnetplan0 libnss-systemd
  libpam-modules libpam-modules-bin libpam-runtime libpam-systemd libpam0g libprocps8 libssl1.1 libsystemd0 libudev1 libxmlb1 linux-base netplan.io open-iscsi
  open-vm-tools openssl procps python-apt-common python3-apt python3-distupgrade python3-software-properties python3-update-manager snapd software-properties-common
  sosreport systemd systemd-sysv systemd-timesyncd tmux ubuntu-advantage-tools ubuntu-release-upgrader-core udev update-manager-core update-notifier-common
45 upgraded, 1 newly installed, 0 to remove and 0 not upgraded.
Need to get 45.3 MB of archives.
After this operation, 11.1 MB of additional disk space will be used.
Do you want to continue? [Y/n] Y

Как видите, размер совпадает, поэтому команда работает отлично.

4
ответ дан 28 July 2021 в 11:20

Итак, с другом мы кое-что меняем. Напоминание: я отправляю сценарий python, чтобы получить размер обновлений для apt и yum.

Это код в python:

def get_upgradable() :
    if os.path.isfile("/usr/bin/apt"):
        command = "apt list --upgradable 2>/dev/null | cut -d'/' -f1"
    elif os.path.isfile("/usr/bin/yum"):
        #command = "yum check-update 2>/dev/null | grep \".x86_64\" | cut -d' ' -f1"
        command="yum check-update | awk '/\S+\s+[0-9]\S+\s+\S+/ {print $1 }'"
    else :
        raise PkgManager("Not found package manager")
        return None
    process = subprocess.Popen(command, shell=True, stdout=subprocess.PIPE, encoding='utf8')
    packages_name = []
    for out in process.stdout :
        packages_name.append(out[:-1])
    return packages_name

def get_yum_size(*args, return_somme=True) :
    command = "yum info {pkg} | egrep \"(Taille|Size)\""
    factor = {"k" : 1000,
              "M" : 1000000,
              "G" : 1000000000}
    somme = 0
    sizes = []
    for pkg in args :
        lines = subprocess.Popen(command.format(pkg=pkg),
                                 shell=True,
                                 stdout=subprocess.PIPE,
                                 encoding='utf8',
                                ).stdout.readlines()
        infos = lines[-1][:-1].split(' ')
        size = float(infos[-2])*factor[infos[-1]]
        sizes.append(size)
        somme += size
    if return_somme : return somme
    return sizes


def get_apt_size(*args, return_somme=True) :
    command = "apt-cache --no-all-versions show {pkg} | grep \"^Size\" | cut -d' ' -f2"
    sizes = []
    somme = 0
    for pkg in args :
        size = int(subprocess.Popen(command.format(pkg=pkg),
                                    shell=True,
                                    stdout=subprocess.PIPE,
                                    encoding='utf8'
                                   ).stdout.read())
        sizes.append(size)
        somme += size
    if return_somme : return somme
    return sizes

def get_size(*args, **kwargs) :
    if os.path.isfile("/usr/bin/apt"):
        return get_apt_size(*args, **kwargs)
    elif os.path.isfile("/usr/bin/yum"):
        return get_yum_size(*args, **kwargs)
    else :
        raise PkgManager("Not found package manager")

И вы вызываете его в основном коде с помощью:

get_size(*get_upgradable())

Если вы попытаетесь, результат будет: 9780000000

Это весь размер обновлений в байтов.

0
ответ дан 28 July 2021 в 11:20

Другие вопросы по тегам:

Похожие вопросы: