скільки місця коштує певний пакет та залежностей?


19

Давши ім'я пакету, я хочу знайти, скільки місця було б звільнено, якби пакет та його залежності були видалені.

Оскільки залежність може бути розподілена між пакунками, можливо, правильний спосіб поставити це: скільки місця займає пакет, включаючи всі залежності, які тільки використовуються цим пакетом

Я вважаю за краще рішення CLI, тому що я б використовував їх у сценаріях


apt-cache show packagenameперераховує, серед іншого, встановлений розмір пакету та залежності пакету. Там же apt-cache rdepends packageє список тих пакунків, які використовують цей пакет. Можливо, ви захочете почати саме там.
saiarcot895

@ saiarcot895 - опублікуйте це як відповідь, будь ласка
Пантера

Відповіді:


15

Найпростіший і без помилок спосіб отримати простір, що використовується програмою та всі її залежності, - це використовувати саме apt. Примітка залежностей, які не використовуються іншою програмою, але встановлені разом з пакетом, не вважаються, оскільки вони не видаляються.
Просто

sudo apt-get --assume-no autoremove PACKAGENAME

або

apt-space-used-by() { sudo apt-get --assume-no autoremove $@ | grep freed | cut -d' ' -f4-5 ;}

використання apt-space-used-by PACKAGENAME

Цей скрипт python виглядає багатообіцяючим (bigpkg - знайдіть пакети, які потребують багато місця у вашій системі)


це не сценарій python для Arch?
josinalvo

спершу слід запустити "sudo apt-get --assume-no autoremove", щоб побачити, чи є пакети, які система хоче все-таки видалити (незалежно від пакету, який ви думаєте видалити)
josinalvo

Хіба це не те, на що я відповів? Вам потрібно виконати 'чистку' після 'видалити'
totti

Я маю на увазі: запустіть це без PACKAGENAME, заведіть номер із PACKAGENAME, отримайте інший. відняти
josinalvo

ви праві, і це особливий випадок.
тотті

5
  • Просто спробуйте виконати таку команду (щоб звільнити місце диска очищенням):

    echo -n | sudo apt-get purge <package> | grep "disk space will be freed"
    

    або

    echo -n | sudo apt-get purge --auto-remove <package> | grep "disk space will be freed"
    

    де замініть <package>своїм package-name(наприклад gimp:)

    Це не очистить пакет залежними, а лише дає скільки дискового простору буде звільнено за допомогою grep!


  • Використання dpkg --print-availабо apt-cache show:

    apt-cache show <package> | grep "Installed-Size"
    

    або

    dpkg --print-avail <package> | grep "Installed-Size"
    

    Це покаже встановлений розмір <package>.

    Приклад:

    $ apt-cache show gimp | grep "Installed-Size"
    Installed-Size: 15024
    

  • Сортувати список встановлених пакетів за розміром

    dpkg-query -W -f='${Installed-Size;8}  ${Package}\n' | sort -n
    

    Ви можете використовувати більше для сторінки:

    dpkg-query -W -f='${Installed-Size;8}  ${Package}\n' | sort -n | more
    

    Пакети вище списку залежно від розміру, який можна tailотримати , ви можете використовувати для перерахування пакетів, що споживають верхній розмір, наступним чином:

    dpkg-query -W -f='${Installed-Size;8}  ${Package}\n' | sort -n | tail
    

  • Використання dpigs(від людини dpigs):

    dpigs - показує, які встановлені пакети займають найбільше місця

    dpigs сортує встановлені пакети за розміром та видає найбільші. На dpigs за замовчуванням відображаються найбільші 10 пакунків. Ви можете змінити
       це значення за допомогою параметра -n (див. "ВАРІАНТИ"). Інформація взята з файла статусу dpkg з grep-status (1)

    Це може бути встановлено за допомогою: Приклад запуску командиsudo apt-get install debian-goodies

    $ dpigs
    115449 wine1.6-i386
    110356 linux-image-extra-3.13.0-24-generic
    103828 libreoffice-core
    86240 fonts-horai-umefont
    74016 libreoffice-common
    72709 liboxideqtcore0
    61736 linux-headers-3.13.0-24
    60821 libpyzy-1.0-0
    59477 firefox
    59443 thunderbird
    

  • Знаходження розміру невикористаного пакету: -

    popularity-contest (8) - list the most popular Debian packages
    popcon-largest-unused (8) - List size of unused packages
    

    Спочатку запустіть, popularity-contestа потім popcon-largest-unused, Це допоможе вам знайти розмір невикористаного пакету. Відвідайте довідкові сторінки для отримання додаткової інформації.


Я намагався зробити все можливе, щоб надати корисні команди за кроками.
Сподіваюсь, це допомагає!


Які одиниці "встановленого розміру" від dpkg / aptcache? Мовляв, байти, кілобайти…?
Привіт-Ангел

2

apt-cache show packagenameперераховує, серед іншого, встановлений розмір пакету та залежності пакету. Там же apt-cache rdepends packagenameє список тих пакунків, які використовують цей пакет.

Ви можете скористатися останньою командою та apt-cache policy packagenameвизначити, чи встановлено зворотну залежність.


Цей розмір не здається читабельним для людини.
ThorSummoner

1
Значення Installed-Sizeзнаходиться в кілобайтах, тоді Sizeяк у байтах. Я повинен був це згадати у своїй відповіді.
saiarcot895

1

Ось сценарій, який це робить. Немає зручності для машин.

sudo apt-get install python-apt

і ти готовий піти.

#!/usr/bin/env python2
# -*- coding: utf-8 -*-

from __future__ import (absolute_import, division,
                        print_function, unicode_literals)
import apt
from apt.cache import Filter, FilteredCache

MB = 1024*1024

class InstalledFilter(Filter):
    def apply(self, pkg):
        return pkg.is_installed

def iter_base_deps(cache, package):
    deps = []
    version = package.installed
    for dep_type in ('Depends', 'PreDepends', 'Recommends'):
        deps.extend(version.get_dependencies(dep_type))
    for dep in deps:
        for base_dep in dep:
            if base_dep.name in cache:
                yield base_dep

def main():
    package_ref_count = {}
    results = []

    cache = FilteredCache(apt.Cache())
    cache.set_filter(InstalledFilter())
    for package in cache:
        for base_dep in iter_base_deps(cache, package):
            if base_dep.name in package_ref_count:
                package_ref_count[base_dep.name] += 1
            else:
                package_ref_count[base_dep.name] = 1

    for package in cache:
        base_deps_size = 0
        base_deps = []
        for base_dep in iter_base_deps(cache, package):
            if package_ref_count[base_dep.name] == 1:
                base_deps.append(base_dep)
                base_deps_size += cache[base_dep.name].installed.installed_size
        total_size = package.installed.installed_size + base_deps_size
        results.append((total_size, package, base_deps_size, base_deps))

    for total_size, package, base_deps_size, base_deps in sorted(results, reverse=True):
        if package.name in package_ref_count:
            continue
        if total_size < MB:
            break
        self_size = package.installed.installed_size
        base_dep_count = len(base_deps)
        print('{:.1f} MB  {}'.format(total_size/MB, package.name) + \
              (' with {} deps'.format(base_dep_count) if base_dep_count else ''))
        if base_dep_count:
            print('    {:.1f} MB  self'.format(self_size/MB))
            for base_dep in base_deps:
                size = cache[base_dep.name].installed.installed_size
                print('    {:.1f} MB  {}'.format(size/MB, base_dep.name))


if __name__ == '__main__':
    main()

Приклад виводу:

72.6 MB  gthumb with 4 deps
    3.0 MB  self
    61.0 MB  libwebkit2gtk-3.0-25
    8.0 MB  gthumb-data
    0.1 MB  gstreamer0.10-gnomevfs
    0.5 MB  flex

Дякую. Це те, що я хочу, список найбільшого пакету, розмір якого включає залежності. Однак вихід не повний, на нього припадає менше, ніж гігабайт. Моя система використовує близько 8 гігів. Більшість має бути пакетами - я впевнений - я майже не маю даних.
Рольф

@Rolf, я радий, що це було корисно. Дійсно, багато пакетів не перелічені, це відбувається, якщо пакет залежить від кількох інших. Я спробував побудувати залежності як графік, щоб користувач міг бачити всі пакунки та всі залежності. Але це перетворюється на повний безлад, кулю спагетті. Вибачте за пізню відповідь.
user2745509
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.