我不明白为什么我得到以下结果:
ls -l 告诉我给定文件(HISTORY)的大小是“581944”:
$ ls -l HISTORY
-rw-rw-r-- 1 waldyrious waldyrious 581944 Feb 22 10:59 HISTORY
Run Code Online (Sandbox Code Playgroud)
ls -s 说它是“572”:
$ ls -s HISTORY
572 HISTORY
Run Code Online (Sandbox Code Playgroud)
我显然需要使这些值使用可比较的比例。所以首先我确认使用--block-size 1inls -l给了我与以前相同的结果:
$ ls -l --block-size 1 HISTORY
-rw-rw-r-- 1 waldyrious waldyrious 581944 Feb 22 10:59 HISTORY
Run Code Online (Sandbox Code Playgroud)
然后我做同样的事情ls -s以获得相同比例的值:
$ ls -s --block-size 1 HISTORY
585728 HISTORY
Run Code Online (Sandbox Code Playgroud)
结果不一样!581944?585728。
我尝试以相反的方式生成可比较的值,使用-k,但我得到:
$ ls -lk HISTORY
-rw-rw-r-- 1 waldyrious waldyrious 569 Feb 22 10:59 HISTORY
$ ls -sk HISTORY
572 HISTORY
Run Code Online (Sandbox Code Playgroud)
同样,不同的结果,569 ? 572 .
我尝试指定 --si 以确保两个选项都使用相同的比例,但无济于事:
$ ls -lk --si HISTORY
-rw-rw-r-- 1 waldyrious waldyrious 582k Feb 22 10:59 HISTORY
$ ls -sk --si HISTORY
586k HISTORY
Run Code Online (Sandbox Code Playgroud)
...再次,不同的值:582k ?586k。
我试着在网上搜索,但我能找到的唯一的事情,似乎是有关本:
某些文件中存在“漏洞”,因此
ls -s(...)列出的使用量小于 列出的文件大小ls -l。”
(请注意,在我的结果中,情况正好相反:ls -s返回的尺寸大于ls -l,而不是更小。)
同时,这个页面说
没有优雅的方法来检测 Unix 文件漏洞。
那么,我该如何处理这种差异呢?哪些值可以被认为是正确的?这可能是一个错误ls吗?
pho*_*bos 52
简短的回答:
ls -l 给出文件的大小(= 它包含的数据量)ls -s --block-size 1 给出文件系统上文件的大小让我们创建两个文件:
甲稀疏文件的128个字节长度(A稀疏文件是包含空块的文件时,看到的稀疏文件):
# 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
Run Code Online (Sandbox Code Playgroud)
另一个具有随机数据的文件,也是 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 |..S.e..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..b.O.S|
00000060 95 13 5a 1c 2a 7e 55 b9 69 a5 50 06 98 e7 71 83 |..Z.*~U.i.P...q.|
00000070 5a d0 82 ee 0b b3 91 82 ca 1d d0 ec 24 43 10 5d |Z...........$C.]|
00000080
Run Code Online (Sandbox Code Playgroud)
因此,正如您在十六进制表示中所看到的,两个文件的数据量相同,但内容却大不相同。
现在,让我们看一下目录:
# 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
Run Code Online (Sandbox Code Playgroud)
第一个值由-s --block-size 1选项给出,它是文件系统上文件使用的空间量。
如您所见,稀疏文件占用零空间,因为文件系统(ext3在本例中)足够聪明,可以识别它只包含零。另外,随机数据的文件在磁盘上占用1024字节!
该值取决于底层文件系统如何处理文件(块大小、稀疏文件能力等)。
在第六列是文件的大小,如果你会读它-它是该文件包含的数据量,它的这两个文件的128个字节!
gun*_*ert 15
ls -s告诉您文件的分配大小,始终是分配单元的倍数。ls -l告诉实际大小。一个简单的测试方法:
$ echo 1 > sizeTest
$ ls -l --block-size 1 sizeTest
-rw-rw-r-- 1 g g 2 Mär 18 15:18 sizeTest
$ ls -s --block-size 1 sizeTest
4096 sizeTest
Run Code Online (Sandbox Code Playgroud)