df 如何知道使用了多少空间而不需要遍历所有文件?

Yan*_*nnP 2 disk-usage

根据我的理解,当用于du获取文件夹的总大小时,该命令会枚举每个(子)文件夹中的每个文件并将其相加。

yann@p:~$ du /var/log
4   /var/log/ntpstats
...
148 /var/log/apt
564 /var/log/installer
8   /var/log/cups
91748   /var/log
Run Code Online (Sandbox Code Playgroud)

但是,该命令如何df立即返回结果,例如

Filesystem     1K-blocks      Used Available Use% Mounted on
/dev/sda1       35209808  18707476  14694008  57% /
Run Code Online (Sandbox Code Playgroud)

无需枚举驱动器上的所有文件?

如果有一种快速的方法来了解整个驱动器上的已用空间,那么为什么没有快速的方法来了解文件夹的大小呢?或者有吗?

提前致谢。

sch*_*ily 6

df使用statvfs()系统调用并向文件系统询问当前空间统计信息。这当然很快,因为文件系统在管理文件系统时始终跟踪文件系统上使用的空间。

因此,速度快的原因df是使用来自文件系统的预先计算的缓存值。

这是历史:

在 20 世纪 70 年代,df出现了一个 suid root 程序,它确实访问原始磁盘设备并从超级块获取文件系统统计信息。

在 20 世纪 80 年代中期,SunOS 引入了系统调用statfs()以及第一个 VFS 实现。此呼叫不再需要特权。该接口已在 Tahoe 会议上上次 SunOS/BSD 代码交换期间提供给 *BSD。

1989 年,SVr4/Solaris 引入了增强的 VFS 接口,将系统调用重命名为statvfs().此版本的系统调用已添加到 POSIX,各种操作系统从该接口复制了该接口。

由于df数据是从仅具有整个文件系统值的超级块间接获取的,因此没有快速的方法来获取单个目录的数字。