我如何检查特定包占用了多少空间?

我如何检查特定包占用了多少空间?

我维护着系统上安装的软件包列表(使用apt-get)。我想知道这些软件包占用了多少空间,如果可能的话,还要知道它们的依赖关系。

我可以使用一些工具吗?或者我必须编写自己的脚本来汇总所有相应的文件(二进制文件、动态库等)?

答案1

忍不住做了一点扩展,完全基于 heemayl 的概念,制作一个具有两个选项的脚本:

  1. 仅输出已安装包的(总)大小(但不输出其依赖项,因为依赖项实际上总是共享的,所以哪个包应该在其“帐户”上拥有它?)

    一个例子:


    $ check_size gimp
    6644.1K

或者:

  1. 生成有关目录、文件、其大小以及已安装文件的总大小的更详细报告(显然大多数行都被跳过了):

    $ check_size gimp --verbose

    Directories:
    ====================
    /usr/share/man
    /usr/share/man/man1
    /usr/share/menu
    /usr/share/pixmaps
    /usr/share/python
    /usr/share/python/runtime.d

    Installed files:
    ====================
    48K /usr/lib/gimp/2.0/plug-ins/sample-colorize
    5,5M    /usr/bin/gimp-2.8
    52K /usr/lib/gimp/2.0/plug-ins/curve-bend
    52K /usr/lib/gimp/2.0/plug-ins/file-psd-load
    52K /usr/lib/gimp/2.0/plug-ins/filter-pack
    52K /usr/lib/gimp/2.0/plug-ins/pagecurl
    52K /usr/lib/gimp/2.0/plug-ins/video
    56K /usr/lib/gimp/2.0/plug-ins/color-rotate
    56K /usr/lib/gimp/2.0/plug-ins/file-ps
    56K /usr/lib/gimp/2.0/plug-ins/print
    56K /usr/lib/gimp/2.0/plug-ins/selection-to-path

    Total size:
    ====================
    6644.1K

如何使用

  1. 将下面的脚本复制到一个空文件中,并将其保存为check_size~/bin或 $PATH 中的其他位置),不带语言扩展。
  2. 使脚本可执行
  3. 如果您刚刚创建了目录~/bin,请运行source .profile,或注销/登录。
  4. 通过以下命令运行它:

    check_size <package>
    

    仅显示尺寸,或者:

    check_size <package> --verbose
    

    详细信息

剧本

#!/usr/bin/env python3
import subprocess
import os
import sys

files = []; drs = []; sizes = []
get =  subprocess.check_output(["/bin/bash", "-c", "dpkg -L "+sys.argv[1]]).decode("utf-8").splitlines()
for l in get:
    if os.path.isfile(l):
        info = subprocess.check_output(["du", "-h", l]).decode("utf-8")
        sizes.append(float(info.split()[0].replace("K", "").replace(",", ".").replace("M", "")))
        files.append(info)
    else:
        drs.append(l)
try:
    if sys.argv[2] == "--verbose":
        print("\nDirectories:\n"+20*"=")
        for l in sorted(drs):
            print(l)
        print("\nInstalled files:\n"+20*"=")
        for l in sorted(files):
            print(l.strip())
        print("\nTotal size:\n"+20*"=")
        print(str(sum(sizes))+"K")
except IndexError:
    print(str(sum(sizes))+"K")

答案2

你可以尝试这个bash脚本:

#!/bin/bash
all_files=( $(dpkg -L "$1") )
for file in "${all_files[@]}"; do
        [ -f "$file" ] && du -h "$file"
done

将包的名称作为第一个参数传递,例如bash script.sh nano

dpkg -L package将列出 所安装的所有文件package,我们将列表保存为数组。它还将包括父目录,为了摆脱目录,我们进行了测试[ -f "$file" ],因此如果数组元素是常规文件,那么我们将通过 获得磁盘上文件的大小du -h

以下是测试结果:

$ bash check_disk.sh vlc
4.0K    /usr/share/menu/vlc
4.0K    /usr/share/lintian/overrides/vlc
8.0K    /usr/share/applications/vlc.desktop
4.0K    /usr/share/kde4/apps/solid/actions/vlc-openbd.desktop
4.0K    /usr/share/kde4/apps/solid/actions/vlc-opencda.desktop
4.0K    /usr/share/kde4/apps/solid/actions/vlc-opendvd.desktop
4.0K    /usr/share/kde4/apps/solid/actions/vlc-openvcd.desktop
4.0K    /usr/lib/mime/packages/vlc
32K /usr/lib/vlc/plugins/video_output/libxcb_xv_plugin.so
12K /usr/lib/vlc/plugins/video_output/libaa_plugin.so
28K /usr/lib/vlc/plugins/video_output/libxcb_window_plugin.so
32K /usr/lib/vlc/plugins/video_output/libgl_plugin.so
24K /usr/lib/vlc/plugins/video_output/libxcb_x11_plugin.so
12K /usr/lib/vlc/plugins/video_output/libglx_plugin.so
40K /usr/lib/vlc/plugins/video_output/libxcb_glx_plugin.so
16K /usr/lib/vlc/plugins/video_output/libcaca_plugin.so
32K /usr/lib/vlc/plugins/video_filter/libpanoramix_plugin.so
16K /usr/lib/vlc/plugins/services_discovery/libxcb_apps_plugin.so
776K    /usr/lib/vlc/plugins/gui/libskins2_plugin.so
2.5M    /usr/lib/vlc/plugins/gui/libqt4_plugin.so
16K /usr/lib/vlc/plugins/control/libglobalhotkeys_plugin.so
20K /usr/lib/vlc/plugins/access/libxcb_screen_plugin.so
12K /usr/lib/vlc/plugins/misc/libxdg_screensaver_plugin.so
12K /usr/lib/vlc/plugins/codec/libsdl_image_plugin.so
32K /usr/lib/vlc/plugins/codec/libvaapi_plugin.so
4.0K    /usr/bin/qvlc
4.0K    /usr/bin/svlc
0   /usr/share/man/man1/qvlc.1.gz
0   /usr/share/man/man1/svlc.1.gz

相关内容