¿cuánto espacio cuesta un paquete y dependencias dados?


19

dado un nombre de paquete, quiero encontrar cuánto espacio se liberaría si el paquete y sus dependencias fueran eliminados.

Como las dependencias pueden compartirse entre paquetes, tal vez la forma correcta de expresarlo es: cuánto espacio ocupa un paquete, incluidas todas las dependencias que este paquete solo utiliza.

Preferiría soluciones CLI, porque las usaría en scripts


apt-cache show packagenameenumera, entre otras cosas, el tamaño instalado de un paquete y las dependencias de un paquete. También hay apt-cache rdepends packageque enumerar los paquetes que usan ese paquete. Es posible que desee comenzar por allí.
saiarcot895

@ saiarcot895 - publíquelo como respuesta, por favor
Panther

Respuestas:


15

La manera más simple y libre de errores para obtener el espacio utilizado por un programa y todas sus dependencias es usar apt. Tenga en cuenta que las dependencias que no utiliza otro programa, pero que se instalan con un paquete, no se consideran, ya que no se eliminan.
Simplemente

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

Este script de Python parece prometedor (bigpkg: encuentre paquetes que requieren mucho espacio en su sistema)


¿No es este script de Python para Arch?
josinalvo

primero debemos ejecutar "sudo apt-get --assume-no autoremove" para ver si hay paquetes que el sistema quiera eliminar de todos modos (independientemente del paquete que esté pensando en eliminar)
josinalvo

¿No es eso lo que respondí?
Debe

Quiero decir: ejecuta esto sin PACKAGENAME, obtén un número con PACKAGENAME, obtén otro. restar
josinalvo

tienes razón, y ese es un caso especial.
totti

5
  • Simplemente intente con el siguiente comando (para liberar espacio en disco mediante la purga):

    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"
    

    donde reemplazará <package>con su package-name(ejemplo: gimp)

    ¡Esto no purgará el paquete con dependencias, sino que solo proporcionará cuánto espacio en disco se liberará con la ayuda de grep!


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

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

    o

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

    Esto mostrará el tamaño instalado de <package>.

    Ejemplo:

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

  • Ordenar la lista de paquetes instalados por tamaño

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

    Puede usar más para la página:

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

    Lista de paquetes anteriores según el tamaño de acceso, puede usar tailpara enumerar los paquetes que consumen el tamaño superior de la siguiente manera:

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

  • Usando dpigs(del hombre dpigs):

    dpigs: muestra qué paquetes instalados ocupan más espacio

    dpigs ordena los paquetes instalados por tamaño y genera los más grandes. Por defecto, dpigs muestra los 10 paquetes más grandes. Tu puedes cambiar
       este valor utilizando la opción -n (consulte "OPCIONES"). La información se toma del archivo de estado dpkg con grep-status (1)

    Esto se puede instalar mediante: Ejemplo de comando de ejecuciónsudo 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
    

  • Encontrar el tamaño del paquete no utilizado: -

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

    Primero ejecute popularity-contesty luego popcon-largest-unused, Esto lo ayudará a encontrar el tamaño del paquete no utilizado. Visite las páginas de manual para más información.


Hice mi mejor esfuerzo para proporcionar comandos útiles por pasos.
Espero que esto ayude!


¿Cuáles son las unidades del "tamaño instalado" de dpkg / aptcache? ¿Como bytes, kilobytes ...?
Hi-Angel

2

apt-cache show packagenameenumera, entre otras cosas, el tamaño instalado de un paquete y las dependencias de un paquete. También hay apt-cache rdepends packagenameque enumerar los paquetes que usan ese paquete.

Es posible que desee utilizar el último comando y apt-cache policy packagenamedeterminar si está instalada una dependencia inversa.


Este tamaño no parece ser legible por humanos.
ThorSummoner

1
El Installed-Sizeestá en kilobytes, mientras que Sizeestá en bytes. Debería haber mencionado eso en mi respuesta.
saiarcot895

1

Aquí hay un guión que hace eso. Sin embargo, no hay salida amigable para la máquina.

sudo apt-get install python-apt

y ya estás listo para partir

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

Salida de ejemplo:

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

Gracias. Esto es lo que quiero, una lista del paquete más grande, con el tamaño que incluye las dependencias. Sin embargo, la salida no está completa, representa menos de un gigabyte. Mi sistema usa aproximadamente 8gigs. La mayor parte tiene que ser paquetes, estoy seguro, casi no tengo datos.
Rolf

@Rolf, me alegra que haya sido útil. De hecho, muchos paquetes no están listados, eso sucede si varios paquetes dependen de un paquete. Intenté trazar las dependencias como un gráfico, de esa manera el usuario podía ver todos los paquetes y todas las dependencias. Pero se convierte en un completo desastre, una bola de espagueti. Lo siento por la respuesta tardía.
user2745509
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.