如果在包含一个字母的文件上运行ls -l,它将以2B大小列出。如果您的文件系统以4k块为单位,我认为它会将文件舍入到块大小?是因为ls -l实际上是从inode读取字节计数吗?在什么情况下,您可以在Linux 2.6内核GNU utils中四舍五入来阻止答案,而不是实际字节数答案?
如果在包含一个字母的文件上运行ls -l,它将以2B大小列出。如果您的文件系统以4k块为单位,我认为它会将文件舍入到块大小?是因为ls -l实际上是从inode读取字节计数吗?在什么情况下,您可以在Linux 2.6内核GNU utils中四舍五入来阻止答案,而不是实际字节数答案?
Answers:
我猜您用echo a > file
或将一个字母输入到文件中vim file
,这意味着您将拥有该字母和一个附加的换行符(两个字符,因此两个字节)。 ls -l
显示文件大小(以字节为单位),而不是块(更具体地说:文件长度):
$ echo a > testfile
$ ls -l testfile
-rw-r--r-- 1 user user 2 Apr 28 22:08 testfile
$ cat -A testfile
a$
(请注意,将cat -A
换行符显示为$
字符)
与相比ls -l
,du
将显示磁盘上实际占用的大小:
$ du testfile
4
(实际上,du
以1kiB为单位显示大小,因此这里的大小是4×1024字节= 4096字节= 4 kiB,这是此文件系统上的块大小)
要ls
显示此内容,您必须使用-s
选项代替/ -l
:
$ ls -ls testfile
4 -rw-r--r-- 1 user user 2 Apr 28 22:08 testfile
第一列是分配的大小,再次以1kiB为单位。最后可以通过指定来更改--block-size
,例如
$ ls -ls --block-size=1 testfile
4096 -rw-r--r-- 1 aw aw 2 Apr 28 22:08 testfile
我认为最深刻的答案如下:
逻辑文件长度和占用的磁盘空间实际上是不同的。
如其他答案所示,从原理上讲,使用两个字节创建的文件的长度为两个字节(以表示ls -l
),并占用4 KiB(以du
或表示ls -ls
)。
看到:
1& [:~/tmp] % echo -n A > test
1& [:~/tmp] % ls -l test
-rw-rw-r-- 1 romano romano 1 Apr 28 14:31 test
1& [:~/tmp] % du test
4 test
好的,test
长度为1,大小(在磁盘上)为4 KiB。但:
1& [:~/tmp] % truncate -s +8191 test
1& [:~/tmp] % ls -l test
-rw-rw-r-- 1 romano romano 8192 Apr 28 14:33 test
1& [:~/tmp] % du test
4 test
(第一个命令将8191个零字节添加到test
),现在测试的长度为8192,但仍在磁盘上占据4 KiB(它有一个“孔”)(1)。
某些文件系统还可以压缩短文件,以便它们通过共享块(例如参见尾部打包)来占用较少的空间,而其他文件系统(如btrfs)确实在写时进行复制,因此文件之间的关系,其逻辑长度以及它占用的空间是多少。磁盘是一个复杂的磁盘。
脚注:
(1)它实际上不是一个孔,它在末尾……但仍然可以运行到示例的末尾。
ls -l
只是长格式。ls -ls
用于显示块大小。
测试中
echo "1" > 1.txt
bash-3.2$ ls -l 1.txt
-rw-rw-r-- 1 ramesh ramesh 2 Apr 28 15:15 1.txt
我们可以看到文件的大小列为2B。但是,如果需要检查块大小,则需要运行以下命令。
bash-3.2$ ls -ls 1.txt
4 -rw-rw-r-- 1 ramesh ramesh 2 Apr 28 15:15 1.txt
上面的4显示使用的块大小。我们还可以使用stat
命令来验证相同的内容。
bash-3.2$ stat 1.txt
File: `1.txt'
Size: 2 Blocks: 8 IO Block: 4096 regular file
Device: 805h/2053d Inode: 48267720 Links: 1
Access: (0664/-rw-rw-r--) Uid: ( 505/ ramesh) Gid: ( 508/ ramesh)
Access: 2014-04-28 15:17:31.000000000 -0500
Modify: 2014-04-28 15:15:58.000000000 -0500
Change: 2014-04-28 15:15:58.000000000 -0500
现在出现了一个问题,为什么ls -ls
将块大小stat
显示为4而将块大小显示为8。在此处的答案中已清楚说明了此行为的原因。
许多磁盘的扇区大小为512字节,这意味着磁盘上的任何读或写操作一次传输整个512字节的扇区。设计文件系统是很自然的,其中一个扇区不在文件之间划分(这会使设计复杂化并损害性能);因此,文件系统倾向于使用512字节的文件块。因此,传统的实用程序(例如
ls
和)du
以512字节块为单位指示大小。