根据我的理解,当用于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)
无需枚举驱动器上的所有文件?
如果有一种快速的方法来了解整个驱动器上的已用空间,那么为什么没有快速的方法来了解文件夹的大小呢?或者有吗?
提前致谢。
df使用statvfs()系统调用并向文件系统询问当前空间统计信息。这当然很快,因为文件系统在管理文件系统时始终跟踪文件系统上使用的空间。
因此,速度快的原因df是使用来自文件系统的预先计算的缓存值。
这是历史:
在 20 世纪 70 年代,df出现了一个 suid root 程序,它确实访问原始磁盘设备并从超级块获取文件系统统计信息。
在 20 世纪 80 年代中期,SunOS 引入了系统调用statfs()以及第一个 VFS 实现。此呼叫不再需要特权。该接口已在 Tahoe 会议上上次 SunOS/BSD 代码交换期间提供给 *BSD。
1989 年,SVr4/Solaris 引入了增强的 VFS 接口,将系统调用重命名为statvfs().此版本的系统调用已添加到 POSIX,各种操作系统从该接口复制了该接口。
由于df数据是从仅具有整个文件系统值的超级块间接获取的,因此没有快速的方法来获取单个目录的数字。