ile miejsca kosztuje dany pakiet i jego zależności?

19

Biorąc pod uwagę nazwę pakietu, chcę dowiedzieć się, ile miejsca zostałoby zwolnione, gdyby pakiet i jego zależności zostały usunięte.

Ponieważ zależności mogą być współużytkowane między pakietami, być może właściwym sposobem jest określenie: ile miejsca zajmuje pakiet, w tym wszystkich zależności, które są tylko wykorzystywane przez ten pakiet

Wolałbym rozwiązania CLI, ponieważ używałbym ich w skryptach

josinalvo
źródło
apt-cache show packagenamewyszczególnia, między innymi, zainstalowany rozmiar pakietu i zależności pakietu. Istnieje również apt-cache rdepends packagelista pakietów, które używają tego pakietu. Możesz zacząć od tego.
saiarcot895
@ saiarcot895 - opublikuj to jako odpowiedź
Panther

Odpowiedzi:

15

Najprostszym i bezbłędnym sposobem na wykorzystanie miejsca przez program i wszystkimi jego zależnościami jest użycie samego apt. Uwaga zależności, które nie są używane przez inny program, ale zainstalowane z pakietem, nie są uwzględniane, ponieważ nie są usuwane.
Po prostu

sudo apt-get --assume-no autoremove PACKAGENAME

lub

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

stosowanie apt-space-used-by PACKAGENAME

Ten skrypt Pythona wygląda obiecująco (bigpkg - znajdź pakiety wymagające dużo miejsca w systemie)

Totti
źródło
nie jest to skrypt Pythona dla Arch?
josinalvo
należy najpierw uruchomić „apt-get --assume-no autoremove”, aby sprawdzić, czy są pakiety system chce usunąć mimo to (niezależnie od pakietu myślicie o usunięcie)
josinalvo
Czy to nie to, na co odpowiedziałem? Musisz wykonać „czyszczenie” po „usunięciu”
totti
Mam na myśli: uruchom to bez PACKAGENAME, uruchom numer z PACKAGENAME, zdobądź kolejny. odejmij
josinalvo
masz rację, a to wyjątkowy przypadek.
totti
5
  • Po prostu spróbuj wykonać następujące polecenie (aby zwolnić miejsce na dysku przez czyszczenie):

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

    lub

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

    gdzie zamień na <package>swój package-name(przykład gimp:)

    Nie spowoduje to wyczyszczenia pakietu z zależnościami, a jedynie poda ile miejsca na dysku zostanie zwolnione przy pomocy grep!


  • Za pomocą dpkg --print-availlub apt-cache show:

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

    lub

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

    Wyświetli się zainstalowany rozmiar <package>.

    Przykład:

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

  • Sortuj listę zainstalowanych pakietów według rozmiaru

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

    Możesz użyć więcej dla strony:

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

    Powyżej listy pakietów według rozmiaru, możesz użyć taildo wyświetlenia listy pakietów o najwyższym rozmiarze w następujący sposób:

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

  • Używając dpigs(od man dpigs):

    dpigs - Pokazuje, które zainstalowane pakiety zajmują najwięcej miejsca

    dpigs sortuje zainstalowane pakiety według rozmiaru i wyświetla największe z nich. Domyślnie dpigs wyświetla największe 10 pakietów. Możesz się zmienić
       ta wartość przy użyciu opcji -n (patrz „OPCJE”). Informacje są pobierane z pliku statusu dpkg z grep-status (1)

    Można to zainstalować przez: Przykład polecenia uruchomieniasudo 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
    

  • Znajdowanie wielkości nieużywanej paczki: -

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

    Najpierw uruchom, popularity-contesta następnie popcon-largest-unused, to pomoże ci znaleźć rozmiar nieużywanego pakietu. Odwiedź strony podręcznika, aby uzyskać więcej informacji.


Starałem się dostarczać przydatne polecenia krok po kroku.
Mam nadzieję, że to pomoże!

Pandya
źródło
Jakie są jednostki „zainstalowanego rozmiaru” z dpkg / aptcache? Jak bajty, kilobajty…?
Hi-Angel,
2

apt-cache show packagenamewyszczególnia, między innymi, zainstalowany rozmiar pakietu i zależności pakietu. Istnieje również apt-cache rdepends packagenamelista pakietów, które używają tego pakietu.

Możesz użyć tego drugiego polecenia i apt-cache policy packagenameustalić, czy zainstalowano odwrotną zależność.

saiarcot895
źródło
Ten rozmiar nie wydaje się być czytelny dla człowieka.
ThorSummoner
1
Installed-SizeJest w kilobajtach, natomiast Sizejest w bajtach. Powinienem był o tym wspomnieć w mojej odpowiedzi.
saiarcot895
1

Oto skrypt, który to robi. Nie ma jednak wyjścia przyjaznego dla maszyny.

sudo apt-get install python-apt

i jesteś gotowy do wyjścia.

#!/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()

Przykładowe dane wyjściowe:

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
użytkownik2745509
źródło
Dziękuję Ci. To jest to, czego chcę, lista największych pakietów, z rozmiarem włącznie. Jednak wynik nie jest kompletny, stanowi mniej niż gigabajt. Mój system używa około 8 gig. Większość to muszą być paczki - jestem pewien - prawie nie mam żadnych danych.
Rolf
@Rolf, cieszę się, że był użyteczny. Rzeczywiście, wiele pakietów nie ma na liście, dzieje się tak, jeśli pakiet zależy od kilku innych. Próbowałem wykreślić zależności jako wykres, w ten sposób użytkownik może zobaczyć wszystkie pakiety i wszystkie zależności. Ale zamienia się w kompletny bałagan, kulkę spaghetti. Przepraszam za spóźnioną odpowiedź.
user2745509