ls -ls 输出显示的块数大于文件大小

ls -ls 输出显示的块数大于文件大小

据我所知,带有“-s”选项的 ls 命令以块为单位打印文件大小,ls 使用 1024 作为块大小,但我注意到一些奇怪的事情。

为了更好地理解,请考虑 ls -ls 命令的以下输出:

12-rw-r--r--。 1 根 10240 七月 15 19:22 z

文件大小为 10240 字节,块大小为 1024,因此该文件的块数为 10240/1024 = 10 个块,但为什么ls显示 12 个块?

问候

答案1

这里实际报告的ls是为文件分配的块的大小。该大小为 12 kB。

这个大小传统上以 512 B 的“块”来报告,因为在古代 Unix 系统上,它确实是许多 512 字节的块。但块大小取决于文件系统,而ls无论如何使用相同的单位。 GNU 工具使用 1 kB 而不是 512 B 作为单位,因为千字节对人类来说比半千字节更有意义。

Ext4 和其他几个常见文件系统默认为 4 kB 块。因此,一个 10240 字节的文件占用 3 个块,这 3 个块的大小为 12 kB。

也可以看看文件块大小 - stat 和 ls 之间的区别块大小和簇大小之间的差异

答案2

这是一个很好的问题:读完后吉尔斯的回答,我被迫阅读man ls,并且ls --help 密切因为我很确定他的答案是错误的。相反,我提供这个答案来证明他是正确的! :P

ls -ls1024 字节文件的结果是:

12 -rw-r--r--. 1 root root 10240 Jul 15 19:22 z

如果我们相信man ls,并且您断言相关文件是 10,240 字节,那么这个结果告诉我们该文件的大小是12 blocks,但该结果并没有告诉我们这些块的大小。如果我们参考相关段落来man ls了解区块大小,我们或多或少会空手而归。

相关段落man ls似乎如下:

--block-size=SIZE
       with -l, scale sizes by SIZE when printing them; e.g., '--block size=M'; see SIZE format below

-k, --kibibytes
        default to 1024-byte blocks for disk usage; used only with -s and per directory totals  

-s, --size
       print the allocated size of each file, in blocks  

The SIZE argument is an integer and optional unit (example: 10K is 10*1024).  Units are K,M,G,T,P,E,Z,Y (powers of 1024) or KB,MB,... (powers of 1000).
不以信仰为依归:

创建一个 10,240 字节的文件,如下所示:

fallocate -l 10240 lstest.txt

核实:

wc -c lstest.txt
10240 lstest.txt
ls -l
  12 -rw-r--r-- 1 pi pi   10240 Jan  4 12:09 lstest.txt  
ls -ls
  12 -rw-r--r-- 1 pi pi   10240 Jan  4 12:09 lstest.txt 
ls -lks 
  12 -rw-r--r-- 1 pi pi   10240 Jan  4 02:09 lstest.txt 
ls -ls --kibibytes 
  12 -rw-r--r-- 1 pi pi   10240 Jan  4 02:09 lstest.txt

正如你所说,这似乎是诡异的因为从文档的表面来看,12 * 1,024 = 12,288 字节 - 这大于 10,240 字节。

但有一个出路:

考虑三件事:

  1. -s选项报告allocation不是文件大小(参考man ls
  2. 块大小是抽象文件系统中定义。它不是一个物理量,但它是高效的使块大小与高级格式扇区大小4,096 字节。自 2011 年 1 月起生产的所有 HDD 均符合高级格式标准。
  3. 我们可以确定文件系统的块大小:
stat -fc %s .     
# or, if you prefer:
stat -fc %s lstest.txt
# which is, in both cases (on my ext3 filesystem):
4096

最后有一些答案

1. 以上结论:ls不知道文件系统使用的块大小。
2. 如果我们知道块大小,我们必须与 分享ls以获得正确答案:
ls -ls --block-size=4K 
3 -rw-r--r-- 1 pi pi    3 Jan  4 02:09 lstest.txt

请注意,3 * 4,096 = 12,288 字节。另请注意,块大小(4,096 字节)是一种量子块设备的存储空间;即存储分配可以改变的最小量。现在很清楚,12,288 字节实际上是所需的字节分配。然而,为了获得块中的正确答案,man ls必须ls通过选项告知系统的块大小--block-size=4K

3.吉尔斯的回答是正确的
沉思:

在我看来,这man ls并不那么清楚。也许应该修改为声明它不知道文件系统块大小?

更好的是,也许ls可以修改以从系统获取块大小?毕竟——stat也是一部分GNU coreutils 8.30

答案3

因为它已成为默认值,所以底层文件系统很可能具有 4k 块大小。因此,您的 10.240 字节文件将需要 3 (ceil(10.240/4096)) 文件系统块。 3 个 4k 块,每个块报告为 3 * 4 = 12 1k 块

相关内容