在ls -l之后的第一行中的“总计”是多少?[关闭]


131

什么是total在输出ls -l

    $ ls -l /etc
    total 3344
    -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

Answers:


94

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

对于列出的每个目录,在文件前添加“ total BLOCKS”行,其中BLOCKS是该目录中所有文件的总磁盘分配。


14
有趣的是,man ls在我的系统上没有提到那条线,但是有提到info coreutils ls。如何产生man ls,并info coreutils ls具有大致相同的命令不同的信息?为什么ls不只记录一次?对于同一命令有两个不同的文档似乎设置失败。
HelloGoodbye

1
info有关coreutils内容的文档通常比手册页更详细。这就是为什么他们在每个手册页的末尾都有一个注释,将您引向信息部分以获取更多详细信息。

7
啊。我执行了info ls它,并给出了与相同的输出info coreutils ls。该论点有coreutils什么作用?
HelloGoodbye

46

公式:那个数字是多少?

int = 每个文件的(physical_blocks_in_use)* physical_block_size / ls_block_size的总和

哪里:

  • ls_block_size是一个任意环境变量(通常为512或1024字节),可以使用--block-size=<int>标志on lsPOSIXLY_CORRECT=1GNU环境变量(获得512字节单位)或-k标志强制1kB单位自由修改 。
  • physical_block_size是内部块接口的OS相关值,该值可以连接也可以不连接到基础硬件。该值通常为512b或1k,但完全取决于OS。可以通过或%B上的值来显示。 请注意,此值(几乎始终)与现代存储设备上的物理块数无关statfstat

为什么这么混乱?

此数字与任何物理或有意义的指标完全无关。许多初级程序员都没有使用文件漏洞硬/符号链接的经验。另外,关于此特定主题的可用文档实际上不存在。

术语“块大小”的脱节和歧义是由于许多不同的度量容易混淆而导致的,并且相对较深的抽象级别围绕着磁盘访问。

信息冲突的示例:( duls -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_usephysical_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

26

那是列出的文件使用的文件系统块的总数,包括间接块。如果您ls -s在相同的文件上运行,并对报告的数字求和,则会得到相同的数字。


这根本不是事实。例如:/bin/ls -s-> total 15 2 filename 3 filename2 3 filename3 3 filename4 2 filename5 2 filename6 2 filename8 2 filename9
唐·斯科特

3
我不知道您使用的是什么系统,但是对我而言,这事实。示例:gist.github.com/rfjakob/200f6001bf91cf801891
Jakob

@Jakob发表了完整答案,看看一下,让我知道是否可以解决。
唐·斯科特

在Windows的Git bash中不是这样。
thdoan

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.