quanto spazio costa un determinato pacchetto e dipendenze?


19

dato il nome di un pacchetto, voglio trovare la quantità di spazio che verrebbe liberata se il pacchetto e le sue dipendenze fossero eliminati.

Poiché le dipendenze potrebbero essere condivise tra i pacchetti, forse il modo giusto per dirlo è: quanto spazio occupa un pacchetto, comprese tutte le dipendenze utilizzate solo da questo pacchetto

Preferirei le soluzioni CLI, perché le userei negli script


apt-cache show packagenameelenca, tra le altre cose, la dimensione installata di un pacchetto e le dipendenze di un pacchetto. C'è anche apt-cache rdepends packageper elencare i pacchetti che usano quel pacchetto. Potresti voler iniziare da lì.
saiarcot895,

@ saiarcot895 - postalo come risposta per favore
Pantera

Risposte:


15

Il modo più semplice e privo di bug per ottenere lo spazio utilizzato da un programma e tutte le sue dipendenze è usare apt stesso. Si noti che le dipendenze non utilizzate da un altro programma, ma installate con un pacchetto, non vengono considerate in quanto non rimosse.
Semplicemente

sudo apt-get --assume-no autoremove PACKAGENAME

o

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

uso apt-space-used-by PACKAGENAME

Questo script Python sembra promettente (bigpkg: trova pacchetti che richiedono molto spazio sul tuo sistema)


non è questo script Python per Arch?
josinalvo,

dovremmo prima eseguire "sudo apt-get --assume-no autoremove" per vedere se ci sono pacchetti che il sistema vuole rimuovere comunque (indipendentemente dal pacchetto che stai pensando di rimuovere)
josinalvo

Non è quello che ho risposto? Devi eseguire 'purge' dopo 'remove'
totti

Voglio dire: esegui questo senza PACKAGENAME, ottieni un numero con PACKAGENAME, prendine un altro. sottrarre
josinalvo il

hai ragione, e questo è un caso speciale.
Totti,

5
  • Prova semplicemente a seguire il comando (per liberare spazio su disco mediante l'eliminazione):

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

    o

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

    dove sostituire <package>con il tuo package-name(esempio gimp:)

    Questo non eliminerà il pacchetto con dipendenze ma fornirà solo la quantità di spazio su disco che verrà liberata con l'aiuto di grep!


  • Utilizzando dpkg --print-availo apt-cache show:

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

    o

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

    Questo mostrerà la dimensione installata di <package>.

    Esempio:

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

  • Ordina l'elenco dei pacchetti installati per dimensione

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

    Puoi usarne di più per quanto riguarda le pagine:

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

    Sopra i pacchetti di elenco in base alle dimensioni, è possibile utilizzare tailper elencare i pacchetti che utilizzano le dimensioni massime come segue:

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

  • Utilizzando dpigs(dall'uomo dpigs):

    dpigs - Mostra quali pacchetti installati occupano più spazio

    dpigs ordina i pacchetti installati per dimensione e produce quelli più grandi. Per impostazione predefinita, dpigs visualizza i 10 pacchetti più grandi. Si può cambiare
       questo valore usando l'opzione -n ​​(vedi "OPZIONI"). Le informazioni sono tratte dal file di stato di dpkg con grep-status (1)

    Questo può essere installato da: Esempio di comando runsudo 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
    

  • Trovare la dimensione del pacchetto non utilizzato: -

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

    Prima esegui popularity-conteste poi popcon-largest-unused, Questo ti aiuterà a trovare la dimensione del pacchetto inutilizzato. Visita le pagine man per maggiori informazioni.


Ho fatto del mio meglio per fornire comandi utili per passaggi.
Spero che questi aiuti!


Quali sono le unità della "dimensione installata" da dpkg / aptcache? Tipo, byte, kilobyte ...?
Hi-Angel,

2

apt-cache show packagenameelenca, tra le altre cose, la dimensione installata di un pacchetto e le dipendenze di un pacchetto. C'è anche apt-cache rdepends packagenameper elencare i pacchetti che usano quel pacchetto.

È possibile che si desideri utilizzare quest'ultimo comando e apt-cache policy packagenamedeterminare se è installata una dipendenza inversa.


Questa dimensione non sembra essere leggibile dall'uomo.
ThorSummoner

1
Il Installed-Sizeè in kilobyte, mentre Sizeè in byte. Avrei dovuto menzionarlo nella mia risposta.
saiarcot895,

1

Ecco una sceneggiatura che lo fa. Nessun output intuitivo però.

sudo apt-get install python-apt

e sei pronto per partire.

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

Esempio di output:

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

Grazie. Questo è quello che voglio, un elenco del pacchetto più grande, con dimensioni comprese le dipendenze. Tuttavia, l'output non è completo, rappresenta meno di un gigabyte. Il mio sistema utilizza circa 8 GB. La maggior parte deve essere un pacchetto - ne sono sicuro - non ho quasi nessun dato.
Rolf,

@Rolf, sono contento che sia stato utile. In effetti, molti pacchetti non sono elencati, ciò accade se un pacchetto dipende da molti altri. Ho provato a tracciare le dipendenze come un grafico, in questo modo l'utente poteva vedere tutti i pacchetti e tutte le dipendenze. Ma si trasforma in un casino completo, una palla di spaghetti. Perdonami per aver risposto tardi.
user2745509
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.