![我如何检查特定包占用了多少空间?](https://linux22.com/image/869999/%E6%88%91%E5%A6%82%E4%BD%95%E6%A3%80%E6%9F%A5%E7%89%B9%E5%AE%9A%E5%8C%85%E5%8D%A0%E7%94%A8%E4%BA%86%E5%A4%9A%E5%B0%91%E7%A9%BA%E9%97%B4%EF%BC%9F.png)
我维护着系统上安装的软件包列表(使用apt-get
)。我想知道这些软件包占用了多少空间,如果可能的话,还要知道它们的依赖关系。
我可以使用一些工具吗?或者我必须编写自己的脚本来汇总所有相应的文件(二进制文件、动态库等)?
答案1
忍不住做了一点扩展,完全基于 heemayl 的概念,制作一个具有两个选项的脚本:
仅输出已安装包的(总)大小(但不输出其依赖项,因为依赖项实际上总是共享的,所以哪个包应该在其“帐户”上拥有它?)
一个例子:
$ check_size gimp
6644.1K
或者:
- 生成有关目录、文件、其大小以及已安装文件的总大小的更详细报告(显然大多数行都被跳过了):
$ 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
如何使用
- 将下面的脚本复制到一个空文件中,并将其保存为
check_size
(~/bin
或 $PATH 中的其他位置),不带语言扩展。 - 使脚本可执行
- 如果您刚刚创建了目录
~/bin
,请运行source .profile
,或注销/登录。 通过以下命令运行它:
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