给定的程序包和依赖项需要多少空间?


19

给定一个程序包名称,我想查找如果删除了程序包及其依赖项,将释放多少空间。

由于包之间可能会共享依赖关系,因此正确的放置方式是:包占用多少空间,包括该包仅使用的所有依赖关系

我更喜欢CLI解决方案,因为我会在脚本中使用它们


apt-cache show packagename除其他事项外,还列出了软件包的安装大小和软件包的依赖关系。还apt-cache rdepends package列出了使用该软件包的软件包。您可能要从那里开始。
saiarcot895

@ saiarcot895-请张贴答案作为答案
Panther

Answers:


15

获得程序及其所有依赖项使用的空间的最简单且无错误的方法是使用apt本身。注意没有被其他程序使用,而是与软件包一起安装的依赖项,因为它们没有被删除,因此不被考虑。
只是

sudo apt-get --assume-no autoremove PACKAGENAME

要么

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

用法 apt-space-used-by PACKAGENAME

这个 python脚本看起来很有希望(bigpkg-查找在系统上需要大量空间的软件包)


这不是Arch的python脚本吗?
josinalvo 2014年

我们应该首先运行“ sudo apt-get --assume-no autoremove”以查看是否有系统要删除的软件包(与您要删除的软件包无关)
josinalvo 2015年

那不是我的回答吗?您需要在“删除”之后执行“清除”
totti 15-4-9

我的意思是:在不使用PACKAGENAME的情况下运行此代码,使用PACKAGENAME进行数字操作,再获取另一个。减去
josinalvo 2015年

你是对的,这是特例。
totti 2015年

5
  • 只需尝试执行以下命令(以通过清除释放磁盘空间):

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

    要么

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

    在哪里替换 <package>你的package-name(例如:gimp

    不会清除具有依赖项的软件包,而仅给出在的帮助下将释放多少磁盘空间grep


  • 使用dpkg --print-availapt-cache show

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

    要么

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

    这将显示已安装的大小 <package>

    例:

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

  • 按大小对已安装软件包的列表进行排序

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

    您可以将更多信息用于逐页:

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

    在上方根据要添加的大小列出软件包,您可以使用tail以下列出列出最大大小的软件包:

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

  • 使用dpigs(来自mandpigs):

    dpigs-显示哪些已安装的软件包占用最多的空间

    dpigs按大小对已安装的软件包进行排序,并输出最大的软件包。默认情况下,dpigs显示最多10个软件包。你可以改变
       通过使用-n选项,此值(请参阅“选项”)。该信息来自带有grep-status(1)的dpkg状态文件。

    可以通过以下方式安装: run命令示例sudo 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
    

  • 查找未使用的包装的尺寸:-

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

    首先运行popularity-contest,然后popcon-largest-unused,这将帮助您查找未使用的软件包的大小。请访问手册页以获取更多信息。


我尽力提供逐步有用的命令。
希望这些会有所帮助!


dpkg / aptcache中“已安装大小”的单位是什么?像是字节,千字节……?
Hi-Angel

2

apt-cache show packagename除其他事项外,还列出了软件包的安装大小和软件包的依赖关系。还有apt-cache rdepends packagename列出了使用该软件包的软件包。

您可能要使用后一个命令并apt-cache policy packagename确定是否安装了反向依赖关系。


此大小似乎不是人类可读的。
ThorSummoner

1
的单位Installed-Size是千字节,而单位Size是字节。我应该在回答中提到这一点。
saiarcot895 '16

1

这是执行此操作的脚本。虽然没有机器友好的输出。

sudo apt-get install python-apt

然后您就可以出发了。

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

输出示例:

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

谢谢。这就是我想要的,一个最大的软件包列表,其大小包括依赖项。但是输出不完整,它所占的空间小于1 GB。我的系统使用大约8gigs。我敢肯定,其中大多数必须是软件包-我几乎没有任何数据。
罗尔夫

@Rolf,很高兴它很有用。确实,没有列出很多软件包,如果一个软件包被其他几个软件包依赖,则会发生这种情况。我尝试将依赖关系绘制为图形,这样用户可以看到所有包和所有依赖关系。但这变成了一团意大利面。抱歉回复晚了。
user2745509
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.