据我所知,带有“-s”选项的 ls 命令以块为单位打印文件大小,ls 使用 1024 作为块大小,但我注意到一些奇怪的东西。
为了更好地理解,请考虑 ls -ls 命令的以下输出:
12 -rw-r--r--。1 根 10240 Jul 15 19:22 z
文件大小为 10240 字节,块大小为 1024,因此该文件的块数为 10240/1024 = 10 个块,但为什么ls
显示 12 个块?
问候
据我所知,带有“-s”选项的 ls 命令以块为单位打印文件大小,ls 使用 1024 作为块大小,但我注意到一些奇怪的东西。
为了更好地理解,请考虑 ls -ls 命令的以下输出:
12 -rw-r--r--。1 根 10240 Jul 15 19:22 z
文件大小为 10240 字节,块大小为 1024,因此该文件的块数为 10240/1024 = 10 个块,但为什么ls
显示 12 个块?
问候
这里
ls
实际报告的是为文件分配的块的大小。该大小为 12 kB。这个大小传统上以 512 B 的“块”报告,因为在古代 Unix 系统上,它确实是许多 512 字节的块。但是块大小取决于文件系统,而
ls
无论如何都使用相同的单位。GNU 工具使用 1 kB 而不是 512 B 作为单位,因为千字节对人类来说比半千字节更有意义。Ext4 和其他几个常见的文件系统默认为 4 kB 块。所以一个 10240 字节的文件占用 3 个块,这 3 个块的大小是 12 kB。
另请参阅文件块大小 - stat 和 ls之间的差异和块大小和集群大小之间的差异。
这是一个很好的问题:在阅读了Gilles 的回答后,我不得不仔细
man ls
阅读,因为我很确定他的回答是错误的。相反,我提供这个答案来证明他是正确的!:Pls --help
您
ls -ls
对 1024 字节文件的结果是:如果我们相信
man ls
,并且您断言有问题的文件是 10,240 字节,那么这个结果告诉我们文件的大小是12 blocks
,但这个结果并没有告诉我们这些块的大小。如果我们参考相关文章man ls
来了解块大小,我们或多或少都是空手而归。相关段落
man ls
似乎如下:什么都不相信:
创建一个 10,240 字节的文件,如下所示:
核实:
正如您所说,这似乎很奇怪,因为从表面上看文档,12 * 1,024 = 12,288 字节 - 大于 10,240 字节。
但有一条出路:
考虑三件事:
-s
选项报告allocation
不是文件大小(参考man ls
)终于有答案了
1.综上所述:
ls
不知道文件系统使用的块大小。2. 如果我们知道块大小,我们必须分享它
ls
以获得正确答案:请注意,3 * 4,096 = 12,288 字节。另请注意,块大小(4,096 字节)是块设备的一种存储量;即存储分配可以改变的最小量。现在很明显,12,288 字节实际上是所需的字节分配。但是,要获得块中的正确答案
man ls
,ls
必须通过--block-size=4K
选项告知系统的块大小。3. Gilles 的回答是正确的
沉思:
在我看来,这
man ls
并不像它可能的那样清楚。也许应该修改为它不知道文件系统块大小?更好的是,也许
ls
可以修改以从系统中获取块大小?毕竟——stat
也是一部分GNU coreutils 8.30
。因为它已成为默认值,所以底层文件系统很可能具有 4k 块大小。因此,您的 10.240 字节文件将需要 3 个 (ceil(10.240/4096)) 文件系统块。3 个 4k 块,每个被报告为 3 * 4 = 12 1k 块