有没有办法计算所有未由包管理器管理的文件的大小?例如,所有在/opt
、/var/
、/usr/local
等目录中的内容。
我想要找出已安装的软件包使用了多少磁盘空间并将其与非托管文件使用的磁盘空间进行比较。
更新:我的问题不同于除了文件系统之外,什么东西占用了我的磁盘这么多空间?
我知道在apt/dpkg
Debian 和 Ubuntu 等发行版上,包管理器(例如 dpkg)会跟踪随其安装的所有文件。我们可以使用类似工具dpkg-query
来获取有关这些包的信息。
例如,我尝试使用以下命令获取所有已安装包的大小:
dpkg-query -W --showformat='${Installed-Size}\n' | \
sort -k1,1n |awk '{s+=$1} END {print s}'
但我认为这是不正确的,因为计算出的总和非常接近总占用空间,/
并且我存储了几 GB 的文件,/opt
这些文件不应该计入这个结果。
本质上,我正在寻找一些可以区分包管理器安装的文件和根文件系统上但不受包管理器管理的所有其他文件的工具。
当我的磁盘开始填满时,我想知道我是否:
a) 安装了太多软件包或 b) 文件系统上有太多其他文件占用了空间。
因此,我希望获得有关我的根文件系统的以下信息:
56GB of 60GB are used on '/':
* 32GB are used by installed packages
* 24GB are used by other files
当我使用类似的工具时baobab
,它不会区分包管理器安装的文件和任何其他文件。
答案1
没有可靠的方法可以做到这一点,因为软件包可能会在安装时下载文件,而这些文件dpkg
不会被注意到。如果卸载,软件包会清理,因此从某种意义上说,它们是受管理的,但dpkg
不会跟踪它们。虽然dpkg
知道软件包的大小,但文件当然可能在安装后发生变化。
软件包中可以包含文件/opt
(例如 Google Chrome),/var/
(例子太多,无法一一列举,就照做吧dpkg -S /var
),/usr/local
(需要安装 SSL 证书使用目录/usr/local
,举个例子)。
可靠的是,您可以排除的唯一目录是/home
、、、(和,但这是文件系统的产物,而不是标准)。/cdrom
/mnt
/media
/lost+found
对我来说,您尝试的命令和下面的命令是合理的一致,并且与实际的文件系统使用情况有很大不同(包中的文件列表在/var/lib/dpkg/info/<package>.list
):
$ (cat /var/lib/dpkg/info/*.list | sudo xargs -d '\n' stat -c '%s' | awk '{c+=$1}END{print int(c/1024)}') 2>/dev/null
5572166
比较:
$ dpkg-query -W --showformat='${Installed-Size}\n' | awk '{c+=$1}END{print c}'
5462957
$ df /
Filesystem 1K-blocks Used Available Use% Mounted on
/dev/sda1 18446076 6744528 10741500 39% /
/var/cache
就我个人而言,我只检查和的大小/home
。