自己看书正好看到这里,正纳闷呢,上网查了下,发现不是我自己在为这个问题感到困惑。
有个大哥提出一个问题:
问题标题: ls -s的单位到底是什么?
man ls 不对啊,哪位能说明下? |
以上是问题的全部。
回答1:
什么操作系统? RHEL6.4,ls -s看见的是block数目! |
大哥之后给出回复:
RHEL 6.2,你用block size * ls -s的结果,算出来的大小是对的?
回答2:
计算了下,结果是按1K为block-size。
猜测:ls -s不指定block-size的情况下,默认以1K为block单位。
指定block-size为4K,计算结果正确!
ls -s --block-size 4k filename
回答3:
看来ls的block-size并不是以你当前文件系统的block size为基准的!它有它自己的道儿…… |
回答4:感觉应该没这么弱智,谁看的懂源码的翻出来看看
回答5:
这不是弱智吧,这是可扩展性。你想想,在大型系统里,可能有N个不同block-size的文件系统,如果ls每次显示文件分配块都要先去检查文件系统的block size,这样同样大小的文件,不同文件系统的输出不一样。 再说人家已经提供了--block-size参数,随你怎么玩。我觉得这样还是比较合理的! |
回答6:
关键是你加上--block-size这个参数后,影响的不光是ls -s,ls -l显示的字节大小也影响了,那指定一个-s参数还有什么意义呢
回答7:
问题都是有解决办法的。。。。。
尝试如下:
export BLOCKSIZE=4k
ls -ls
看看是不是你想要的。
嫌麻烦?把BLOCKSIZE环境变量加入.bash_profile。
回答8:
到最后我也不知道哪个对?大家怎么看
另一个帖子也说明了类似问题,读完这个帖子后,我豁然开朗了:
c - 使用 stat() 和 ls -s 分配的 block 数不同
我试图使用 C 获取分配给文件的 block 数。我使用了 stat 结构及其名为 st_blocks 的变量。然而,与 ls -s 相比,这将返回不同数量的 block 。任何人都可以解释造成这种情况的原因以及是否有办法解决这个问题?
最佳答案
没有差异;只是一个误会。这里有两个独立的“ block 大小”。使用 ls -s --block-size=512
也可以为 ls
使用 512 字节的 block 大小。
ls -s命令以用户指定的单位(“ block ”)列出分配给文件的大小,您可以使用 --block-size
选项指定其大小。
struct stat 中的 st_blocks
字段以512字节为单位。
您看到了差异,因为两个“ block 大小” 不相同。他们只是碰巧被称为同一个名字。
这是一个您可以检查此效果的示例。这适用于所有 POSIXy/Unixy 文件系统(支持 sparse file ),但不适用于 FAT/VFAT 等。
首先,让我们创建一个 1 兆字节长的文件,但在开头有一个空洞(它们读取为零,但实际上并未存储在磁盘上),最后只有一个字节(我将使用 'X'
).
我们通过使用 dd
来跳过文件的前 1048575 个字节(创建一个“洞”,从而在支持此类的文件系统上创建一个稀疏文件):
printf 'X' | dd bs=1 seek=1048575 of=sparse-file count=1
我们可以使用 stat实用程序来检查文件。格式说明符 %s
提供文件的逻辑大小 (1048576),%b
block 数 (st_blocks
):
stat -c 'st_size=%s st_blocks=%b' sparse-file
在我的系统上,我得到 st_size=1048576 st_blocks=8
,因为实际的文件系统 block 大小是 4096 字节(= 8×512),而这个稀疏文件只需要一个文件系统 block 。
但是,使用 ls -s sparse-file
我得到了 4 sparse-file
,因为默认的 ls block 大小是 1024 字节。如果我跑
ls --block-size=512 -s sparse-file
然后我看到了 8 sparse-file
,如我所料。
关于c - 使用 stat() 和 ls -s 分配的 block 数不同,我们在Stack Overflow上找到一个类似的问题:
相信大家也和我一样开朗了把?
最后我自己也有自己的一个问题:
[root@localhost 下载]# ls -l
总用量 402004
-rw-rw-r--. 1 alice alice 411651587 11月 26 05:02 wps-office-11.1.0.11711-1.x86_64.rpm
[root@localhost 下载]# stat *文件:wps-office-11.1.0.11711-1.x86_64.rpm大小:411651587 块:804008 IO 块:4096 普通文件
设备:fd02h/64770d Inode:268682688 硬链接:1
权限:(0664/-rw-rw-r--) Uid:( 1001/ alice) Gid:( 1001/ alice)
环境:unconfined_u:object_r:user_home_t:s0
最近访问:2023-11-26 05:03:10.828090477 -0500
最近更改:2023-11-26 05:02:23.890821053 -0500
最近改动:2023-11-26 05:02:38.910227255 -0500
创建时间:-
[root@localhost 下载]# ls -lh
总用量 393M
-rw-rw-r--. 1 alice alice 393M 11月 26 05:02 wps-office-11.1.0.11711-1.x86_64.rpm
[root@localhost 下载]# ls -s
总用量 402004
402004 wps-office-11.1.0.11711-1.x86_64.rpm
[root@localhost 下载]# du *
402004 wps-office-11.1.0.11711-1.x86_64.rpm
首先:看ls -l输出的大小:411651587,我自己用手机计算器算了下:411651587/1024/1024=392.58154...。再结合ls -lh的输出大小:393M,可推算之411651587的单位是字节,而不是网上说的ls 的文件大小输出单位是千字节,所以自己的情况,可能和网上说的情况是不一样的。
继续推算,可以得出:
stat命令的块大小是512byte。正好等于一个扇区的大小。
ls -s输出的一个块大小是1024byte。
du输出的块大小是,1024byte。
结论,ls -s 和stat中块的大小单位是不一样的,只不过就是使用过了同样的名称:块。
人家ls -s 提供了--block-size=参数,可以自己设置查询时候的块大小,例如:
[root@localhost 下载]# ls -s --block-size=1k
总用量 402004
402004 wps-office-11.1.0.11711-1.x86_64.rpm
[root@localhost 下载]# ls -s --block-size=2k
总用量 201002
201002 wps-office-11.1.0.11711-1.x86_64.rpm
[root@localhost 下载]# ls -s --block-size=4k
总用量 100501
100501 wps-office-11.1.0.11711-1.x86_64.rpm
[root@localhost 下载]# ls -s --block-size=1m
总用量 393
393 wps-office-11.1.0.11711-1.x86_64.rpm
[root@localhost 下载]# ls -s --block-size=1g
总用量 1
1 wps-office-11.1.0.11711-1.x86_64.rpm
[root@localhost 下载]# ls -s --block-size=10g
总用量 1
1 wps-office-11.1.0.11711-1.x86_64.rpm
[root@localhost 下载]# ls -s --block-size=1m
总用量 393
393 wps-office-11.1.0.11711-1.x86_64.rpm