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

josinalvo
fonte
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)

totti
fonte
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!

Pandya
fonte
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.

saiarcot895
fonte
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
user2745509
fonte
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