为什么 ls-l 中的“ total”加起来不等于列出的总文件大小?

为什么 ls -l输出中的 总数打印成 64而不是所有文件的总和 26078

    $ ls -l ~/test/ls
total 64
-rw-r--r--   1 root root   15276 Oct  5  2004 a2ps.cfg
-rw-r--r--   1 root root    2562 Oct  5  2004 a2ps-site.cfg
drwxr-xr-x   4 root root    4096 Feb  2  2007 acpi
-rw-r--r--   1 root root      48 Feb  8  2008 adjtime
drwxr-xr-x   4 root root    4096 Feb  2  2007 alchemist
77314 次浏览

您可以在平台的 ls文档中找到该行的定义。对于 coreutils ls(在许多 Linux 系统上都可以找到) ,可以通过 info coreutils ls找到这些信息:

对于列出的每个目录,在文件前面加一行 ‘ total BLOCKS’,其中 BLOCKS 是所有磁盘的总分配 目录中的文件。

即列出的文件所使用的文件系统块(包括间接块)的总数。如果对相同的文件运行 ls -s并对报告的数字进行求和,您将得到相同的数字。

顺便提一下-您可以使用-h (ls-lh)将其转换为人类可读的格式。

公式: 那个是多少?

Total Int = 每个文件的 (Physical _ block _ in _ use) * Physical _ block _ size/ls _ block _ size)之和。

在哪里:

  • ls_block_size是一个 任意环境变量(通常为512或1024字节) ,可以使用 ls上的 --block-size=<int>标志,即 POSIXLY_CORRECT=1 GNU 环境变量(获得512字节的单位) ,或者强制使用 -k标志 1kB 单位。
  • physical_block_size是与操作系统相关的内部块接口值,它可能连接到底层硬件,也可能不连接到底层硬件。这个值通常是512b 或1k,但是完全取决于 OS。它可以通过 statfstat上的 %B值来揭示。注意,这个值(几乎总是)与 < em > Modern 存储设备上的物理块数量无关。

为什么这么困惑?

这个数字与任何物理或有意义的度量标准相当分离。许多初级程序员没有使用 文件孔硬/系统连结的经验。此外,关于这个特定主题的文档实际上是不存在的。

术语 “块大小”的不连贯性和模糊性是由于许多不同的措施很容易混淆,以及围绕磁盘访问的相对深层次的抽象所造成的。

冲突信息的例子: 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 = < strong > 118积分

注意: 可以使用命令 stat * --printf="%b\t(%B)\t%n: %s bytes\n" > 输出(按顺序)块的数量,(括号)块的大小 块、文件名和大小(以字节为单位) ,如上所示。

有两件重要的事情需要注意:

  • stat同时报告 physical_blocks_in_usephysical_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