我有一个 ASCII 文本文件:
file foo
foo: ASCII text
其中仅包含 6 个字母(“F”后没有任何换行符或空格):
cat foo
ABCDEF
由于这是 ASCII,因此文件大小应该只是 6 个字节(因为 ASCII 是每个字符 1 个字节)。
但是,如果我习惯du
这样做,我会得到一些令人困惑的结果:
du -bsch foo
7 foo
7 total
和
du -ksch foo
4.0K foo
4.0K total
所以,不仅文件大小比预期的6b大,而且当我以字节为单位和以kb为单位写入时也是不同的。
所以,我的问题是
- 为什么文件大小比预期的 6b 高?额外的字节去哪里了?
du
为什么不同单位的输出不同?
注意:这可能不是 Linux 问题。我把它放在这里,而不是在一些计算机科学论坛上,因为我使用的是 Unix 命令。
更新部门规模:
Disk /dev/sda: 476.94 GiB, 512110190592 bytes, 1000215216 sectors
Disk model: SanDisk SD8SN8U5
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disklabel type: gpt
Disk identifier: D12CA635-6354-48FF-A0D6-0D3CB4BDBE2E
Device Start End Sectors Size Type
/dev/sda1 2048 534527 532480 260M EFI System
/dev/sda2 534528 567295 32768 16M Microsoft reserved
/dev/sda3 567296 208748856 208181561 99.3G Microsoft basic data
/dev/sda4 208750592 210485247 1734656 847M Windows recovery environment
/dev/sda5 210485248 212582399 2097152 1G Linux filesystem
/dev/sda6 212582400 1000214527 787632128 375.6G Linux filesystem
Disk /dev/zram0: 7.65 GiB, 8210350080 bytes, 2004480 sectors
Units: sectors of 1 * 4096 = 4096 bytes
Sector size (logical/physical): 4096 bytes / 4096 bytes
I/O size (minimum/optimal): 4096 bytes / 4096 bytes
更新 od
输出:
od -c foo
0000000 A B C D E F \n
0000007
答案1
Linux 中的现代文件系统的块大小始终为 4096 字节。您可以使用stat -f foo
它来验证这一点。
du -b
告诉你 block-size=1 的表观大小。因此它告诉您实际的内容字节(而且它不知道稀疏性)。
du -k
给出实际的磁盘大小(以 KiB 为单位)。您的文件小于 4096,因此它为您提供 4k。
这是一个例子:
du -b foo.txt
4 foo.txt
du --block-size=1 foo.txt
4096 foo.txt
du -b foo-5k.bin
5120 foo-5k.bin
du --block-size=1 foo-5k.bin
8192 foo-5k.bin
可以看到实际磁盘大小为N*4096