公式:那个数字是什么?
总 int = 每个文件的(physical_blocks_in_use) * physical_block_size/ls_block_size)之和。
其中:
ls_block_size
是一个任意的环境变量(通常为512或1024字节),可以通过使用ls
命令的--block-size=<int>
标志、POSIXLY_CORRECT=1
GNU环境变量(以获取512字节单位)或-k
标志来自由修改。
physical_block_size
是一个内部块接口的操作系统相关值,可能与底层硬件连接或不连接。该值通常为512b或1k,但完全取决于操作系统。它可以通过stat
或fstat
上的%B
值来显示。 请注意,这个值(几乎总是)与现代存储设备上物理块的数量无关。
为什么这么令人困惑?
这个数字与任何物理或有意义的度量相当独立。许多初级程序员没有经验处理文件空洞或硬链接/符号链接。此外,关于这个特定主题的可用文档几乎不存在。
"块大小"术语的不连贯性和模糊性是许多不同措施容易混淆以及围绕磁盘访问的相对深层次的抽象的结果。
冲突信息示例: du
(或ls -s
)与stat
在项目文件夹中运行du *
将产生以下结果:(注意:ls -s
返回相同的结果。)
dactyl:~/p% du *
2 check.cc
2 check.h
1 DONE
3 Makefile
3 memory.cc
5 memory.h
26 p2
4 p2.cc
2 stack.cc
14 stack.h
总计:2+2+1+3+3+5+26+4+2+14 = 62块
然而,当我们运行stat
命令时,我们会看到一组不同的值。在同一目录下运行stat
命令会得到如下结果:
dactyl:~/p% stat * --printf="%b\t(%B)\t%n: %s bytes\n"
3 (512) check.cc: 221 bytes
3 (512) check.h: 221 bytes
1 (512) DONE: 0 bytes
5 (512) Makefile: 980 bytes
6 (512) memory.cc: 2069 bytes
10 (512) memory.h: 4219 bytes
51 (512) p2: 24884 bytes
8 (512) p2.cc: 2586 bytes
3 (512) stack.cc: 334 bytes
28 (512) stack.h: 13028 bytes
总共: 3+3+1+5+6+10+51+8+3+28 = 118个块
注意: 您可以使用命令stat * --printf="%b\t(%B)\t%n: %s bytes\n"
来输出(按顺序)块数,括号中的这些块的大小,文件名和字节大小,如上所示。
有两件重要的事情需要注意:
stat
报告的是physical_blocks_in_use
和physical_block_size
,这些值是基于操作系统接口的。
du
提供的是物理磁盘利用率的相当准确的估计。
参考一下,这是上面目录的ls -l
:
dactyl:~/p% ls -l
**total 59**
-rw-r--r--. 1 dhs217 grad 221 Oct 16 2013 check.cc
-rw-r--r--. 1 dhs217 grad 221 Oct 16 2013 check.h
-rw-r--r--. 1 dhs217 grad 0 Oct 16 2013 DONE
-rw-r--r--. 1 dhs217 grad 980 Oct 16 2013 Makefile
-rw-r--r--. 1 dhs217 grad 2069 Oct 16 2013 memory.cc
-rw-r--r--. 1 dhs217 grad 4219 Oct 16 2013 memory.h
-rwxr-xr-x. 1 dhs217 grad 24884 Oct 18 2013 p2
-rw-r--r--. 1 dhs217 grad 2586 Oct 16 2013 p2.cc
-rw-r--r--. 1 dhs217 grad 334 Oct 16 2013 stack.cc
-rw-r--r--. 1 dhs217 grad 13028 Oct 16 2013 stack.h
-l
被设置为以晦涩的方式显示总数,几乎没有人需要。但是-lh
是你 99.9% 的时间所需的。那么为什么不将-l
设置为 MB,将-lAlmostNeverNeeded
设置为块呢? 2)--help
中没有总数。 3)man
中没有总数。 4)让我们浪费时间:查看--help
,转到man
,记住info
,继续阅读。 (如果你在 Windows 上使用便携式 bash,则不包括 man 或 info,因此你需要像我现在正在做的那样搜索它。) 最后,在 SO 上:让我们惩罚本地人类问题。我们奖励对糟糕手册的无尽阅读。 - CoR