Quanto espaço custa um determinado pacote e dependências?


19

dado um nome de pacote, quero descobrir quanto espaço seria liberado se o pacote e suas dependências fossem excluídos.

Como as dependências podem ser compartilhadas entre os pacotes, talvez o caminho certo seja: quanto espaço um pacote ocupa, incluindo todas as dependências que estão sendo usadas apenas por este pacote

Eu preferiria soluções CLI, porque as usaria em scripts


apt-cache show packagenamelista, entre outras coisas, o tamanho instalado de um pacote e as dependências de um pacote. Também há apt-cache rdepends packagepara listar os pacotes que usam esse pacote. Você pode querer começar por aí.
— saiarcot895

@ saiarcot895 - post que como uma resposta por favor
— Panther

Respostas:


15

A maneira mais simples e sem bugs de obter o espaço usado por um programa e todas as suas dependências é usar o próprio apt. Observe as dependências que não são usadas por outro programa, mas instaladas com um pacote, não são consideradas, pois não são removidas.
Simplesmente

sudo apt-get --assume-no autoremove PACKAGENAME

ou

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

uso apt-space-used-by PACKAGENAME

Este script python parece promissor (bigpkg - encontre pacotes que requerem muito espaço no seu sistema)


este script python não é para o Arch?
— josinalvo

devemos primeiro executar "sudo apt-get --assume-não autoremove" para ver se existem pacotes do sistema quer remover qualquer maneira (independente do pacote que você está pensando em remover)
— josinalvo

Não foi isso que eu respondi? Você precisa executar 'purgar' após 'remover'
— totti 9/04/2015

Quero dizer: execute isso sem PACKAGENAME, obtenha um número com PACKAGENAME, obtenha outro. subtrair
— josinalvo

você está certo, e esse é um caso especial.
— Totti #

5
  • Simplesmente tente o seguinte comando (para liberar espaço em disco por limpeza):

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

    ou

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

    onde substitua <package>pelo seu package-name(exemplo gimp:)

    Isso não limpará o pacote com dependências, mas apenas fornecerá quanto espaço em disco será liberado com a ajuda do grep!


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

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

    ou

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

    Isso exibirá o tamanho instalado de <package>.

    Exemplo:

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

  • Classifique a lista de pacotes instalados por tamanho

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

    Você pode usar mais para a página:

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

    Acima da lista de pacotes de acordo com o tamanho de acesso, você pode usar tailpara listar os pacotes que consomem o tamanho superior da seguinte maneira:

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

  • Usando dpigs(do homem dpigs):

    dpigs - Mostra quais pacotes instalados ocupam mais espaço

    O dpigs classifica os pacotes instalados por tamanho e gera os maiores. Por padrão, o dpigs exibe os 10 maiores pacotes. Você pode mudar
       esse valor usando a opção -n (consulte "OPÇÕES"). As informações são obtidas do arquivo de status do dpkg com grep-status (1)

    Pode ser instalado por: Exemplo de comando de execuçãosudo 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
    

  • Localizando o tamanho do pacote não utilizado: -

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

    Primeiro, execute popularity-conteste popcon-largest-unused, em seguida , Isso ajudará você a encontrar o tamanho do pacote não utilizado. Visite as páginas de manual para obter mais informações.


Eu tentei o meu melhor para fornecer comandos úteis por etapas.
Espero que isso ajude!


Quais são as unidades do "tamanho instalado" do dpkg / aptcache? Tipo, bytes, kilobytes ...?
— Hi-Angel

2

apt-cache show packagenamelista, entre outras coisas, o tamanho instalado de um pacote e as dependências de um pacote. Também há apt-cache rdepends packagenamepara listar os pacotes que usam esse pacote.

Você pode usar o último comando e apt-cache policy packagenamedeterminar se uma dependência reversa está instalada.


Esse tamanho não parece legível por humanos.
— precisa saber é o seguinte

1
O Installed-Sizeestá em kilobytes, enquanto o Sizeem bytes. Eu deveria ter mencionado isso na minha resposta.
— precisa saber é o seguinte

1

Aqui está um script que faz isso. Porém, nenhuma saída amigável à máquina.

sudo apt-get install python-apt

e você está pronto para ir.

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

Exemplo de saída:

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

Obrigado. É isso que eu quero, uma lista do maior pacote, com o tamanho incluindo dependências. No entanto, a saída não está completa, é responsável por menos de um gigabyte. Meu sistema usa cerca de 8gigs. A maioria tem que ser pacotes - tenho certeza - quase não tenho dados.
— Rolf

@Rolf, estou feliz que tenha sido útil. De fato, muitos pacotes não estão listados, o que acontece se um pacote depender de vários outros. Tentei plotar dependências como um gráfico, para que o usuário pudesse ver todos os pacotes e todas as dependências. Mas se transforma em uma bagunça completa, uma bola de espaguete. Desculpe pela resposta tardia.
— user2745509
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.