为什么ls -l输出与ls -s不同的大小?

我无法弄清楚为什么我得到以下结果:

ls -l告诉我给定文件(HISTORY)的大小是“581944”:

 $ ls -l HISTORY -rw-rw-r-- 1 waldir waldir 581944 Feb 22 10:59 HISTORY 

ls -s表示它是“572”:

 $ ls -s HISTORY 572 HISTORY 

我显然需要使这些值使用可比较的比例。 所以首先我确认在ls -l中使用--block-size 1给出了与之前相同的结果:

 $ ls -l --block-size 1 HISTORY -rw-rw-r-- 1 waldir waldir 581944 Feb 22 10:59 HISTORY 

然后我对ls -s做同样的事情以获得相同比例的值:

 $ ls -s --block-size 1 HISTORY 585728 HISTORY 

结果不同! 581944≠585728

我尝试使用-k以相反的方式生成可比较的值,但我得到:

 $ ls -lk HISTORY -rw-rw-r-- 1 waldir waldir 569 Feb 22 10:59 HISTORY $ ls -sk HISTORY 572 HISTORY 

再次,不同的结果, 569≠572

我尝试指定–si以确保两个选项都使用相同的比例,但无济于事:

 $ ls -lk --si HISTORY -rw-rw-r-- 1 waldir waldir 582k Feb 22 10:59 HISTORY $ ls -sk --si HISTORY 586k HISTORY 

……再次,不同的值: 582k≠586k

我尝试在网上搜索,但我唯一能找到的东西似乎是相关的:

有些文件中有“漏洞”,因此ls -s (…)列出的用法小于ls -l列出的文件大小。“

(请注意,在我的结果中会发生相反的情况: ls -s返回的大小大于ls -l ,而不是更小。)

同时, 这个页面说明了这一点

没有优雅的方法来检测Unix文件漏洞。

那么,我该如何处理这种差异呢? 哪些值可以被认为是正确的? 这可能是ls一个错误吗?

简短回答:

  • ls -l给出文件的大小(=它包含的数据量)
  • ls -s --block-size 1给出文件系统上文件的大小

让我们创建两个文件:

128字节长度的稀疏文件(稀疏文件是包含空块的文件,请参阅稀疏文件 ):

 # truncate -s 128 f_zeroes.img # hexdump -vC f_zeroes.img 00000000 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................| 00000010 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................| 00000020 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................| 00000030 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................| 00000040 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................| 00000050 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................| 00000060 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................| 00000070 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................| 00000080 

另一个带有随机数据的文件,也是128字节大小:

 # dd if=/dev/urandom of=f_random.img bs=1 count=128 # hexdump -vC f_random.img 00000000 bc 82 9c 40 04 e3 0c 23 e6 76 79 2f 95 d4 0e 45 |...@...#.vy/...E| 00000010 19 c6 53 fc 65 83 f8 58 0a f7 0e 8f d6 d6 f8 b5 |..Se.X........| 00000020 6c cf 1b 60 cb ef 06 c6 d0 99 c6 16 3f d3 95 02 |l..`........?...| 00000030 85 1e b7 80 27 93 27 92 d0 52 e8 72 54 25 4d 90 |....'.'..R.rT%M.| 00000040 11 59 a2 d9 0f 79 aa 23 2d 44 3d dd 8d 17 d9 36 |.Y...y.#-D=....6| 00000050 f5 ae 07 a8 c1 b4 cb e1 49 9e bc 62 1b 4f 17 53 |........I..bOS| 00000060 95 13 5a 1c 2a 7e 55 b9 69 a5 50 06 98 e7 71 83 |..Z.*~UiP..q.| 00000070 5a d0 82 ee 0b b3 91 82 ca 1d d0 ec 24 43 10 5d |Z...........$C.]| 00000080 

因此,正如您在hex表示中看到的那样,两个文件具有相同数量的数据 ,尽管内容完全不同。

现在,让我们看看目录:

 # ls -ls --block-size 1 f_* 1024 -rw-r--r-- 1 user user 128 Mar 18 15:34 f_random.img 0 -rw-r--r-- 1 user user 128 Mar 18 15:32 f_zeroes.img ^ ^ | | Amount which the Actual file size files takes on the fs 

第一个值由-s --block-size 1选项给出,它是文件系统上文件使用的空间量

如您所见,稀疏文件占用零空间,因为文件系统(在本例中为ext3 )足够智能,可以识别它只包含零。 此外,具有随机数据的文件占用磁盘上的1024个字节!

该值取决于基础文件系统如何处理文件(块大小,稀疏文件function……)。

在第六列是文件的大小,如果你要读它 – 它是文件包含的数据量,它是两个文件128字节!

ls -s告诉你文件的分配大小,总是分配单元的倍数。 ls -l告诉实际大小。 一种简单的测试方法:

 echo 1 > sizeTest ls -l --block-size 1 sizeTest -rw-rw-r-- 1 gg 2 Mär 18 15:18 sizeTest ls -s --block-size 1 sizeTest 4096 sizeTest