公式:那个数字是多少?
总int = 每个文件的(physical_blocks_in_use)* physical_block_size / ls_block_size的总和。
哪里:
ls_block_size
是一个任意环境变量(通常为512或1024字节),可以使用--block-size=<int>
标志on ls
,POSIXLY_CORRECT=1
GNU环境变量(获得512字节单位)或-k
标志强制1kB单位自由修改
。
physical_block_size
是内部块接口的OS相关值,该值可以连接也可以不连接到基础硬件。该值通常为512b或1k,但完全取决于OS。可以通过或%B
上的值来显示。 请注意,此值(几乎始终)与现代存储设备上的物理块数无关。stat
fstat
为什么这么混乱?
此数字与任何物理或有意义的指标完全无关。许多初级程序员都没有使用文件漏洞或硬/符号链接的经验。另外,关于此特定主题的可用文档实际上不存在。
术语“块大小”的脱节和歧义是由于许多不同的度量容易混淆而导致的,并且相对较深的抽象级别围绕着磁盘访问。
信息冲突的示例:( 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
。请注意,这些是基于OS接口的值。
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
man ls
在我的系统上没有提到那条线,但是有提到info coreutils ls
。如何产生man ls
,并info coreutils ls
具有大致相同的命令不同的信息?为什么ls
不只记录一次?对于同一命令有两个不同的文档似乎设置失败。