据我所知,带有“-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。
答案2
这是一个很好的问题:读完后吉尔斯的回答,我被迫阅读man ls
,并且ls --help
密切因为我很确定他的答案是错误的。相反,我提供这个答案来证明他是正确的! :P
ls -ls
1024 字节文件的结果是:
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 字节。
但有一个出路:
考虑三件事:
- 该
-s
选项报告allocation
不是文件大小(参考man ls
) - 块大小是抽象文件系统中定义。它不是一个物理量,但它是高效的使块大小与高级格式扇区大小4,096 字节。自 2011 年 1 月起生产的所有 HDD 均符合高级格式标准。
- 我们可以确定文件系统的块大小:
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 块