我对 Ubuntu 还很陌生,想学习更多 Linux 编程。
每次我打印ls -l
并再次比较我自己的代码以添加st_blocks
每个文件时,结果总是 stat 块是ls
块大小的两倍?
有没有特别的解释?
在命令行中:
$ ls -ls
total 28
4 ... test
20 ... test.c
4 ... test.txt
程序总和非'。' 文件:
$ myls
total 56
8 ... test
40 ... test.c
8 ... test.txt
循环中使用的代码摘录:
...
...
if (dirName[0] != '.') {
blocksize += buf.st_blocks;
}
return blocksize;
...
统计
st_blocks
在使用 Linux 内核的系统(包括所有 GNU/Linux 系统,例如 Ubuntu)上,用作单位的块大小始终为 512 字节。在大多数其他类 Unix 操作系统上也是如此。正如斯蒂芬基特在回答为什么 st_blocks 总是以 512 字节块报告时所解释的那样?:
(强调我的)
stat(2)列出 的成员
struct stat
,其中包括:该
stat
命令(参见stat(1))同样使用 512 字节的块大小。例如,正如 所揭示的ls -l
,在我的系统/bin/nano
上是 208480 字节大,并且stat /bin/nano
包括Blocks: 408
.ls
ls -l
默认情况下以字节为单位打印文件大小,但ls -s
以 1024 字节块的形式打印它们。存在ls
一些默认为 512 字节块的类 Unix 系统的实现,但 GNU ls(/bin/ls
在 Ubuntu 中提供)和busybox ls
(在 Ubuntu 中提供的其他ls
实现)都默认为 1024 字节块。-k
即使在某些其他系统上可能需要此行为,您也不必通过此行为。以块为单位打印文件大小时,Ubuntu 的
ls
命令默认为 1024 字节块,因为它们更方便。--block-size
如果你愿意,你可以改变它。在实践中,我认为最流行的方法是:-l
而不-s
获取以字节为单位的大小(实际上是块大小为 1)-l
或-s
使用-h
单位标签打印更多人类可读的尺寸-s
并使用默认的 1024 字节某些 GNU 实用程序在POSIX 兼容模式下运行时会打印 512 字节的块。
du
是一个特别明显的案例;将 的输出与 的输出进行du /bin/nano
比较POSIXLY_CORRECT= du /bin/nano
。-s
GNU ls 在传递时也有这种行为,但是带有-l
和 not-s
的输出以及带有 的输出-h
不受影响。(没有选项的输出当然也不受影响,因为它不会打印大小。)除了支持之外
--block-size
,GNU ls 还尊重其他一些环境变量,尤其是BLOCK_SIZE
. 与 不同的POSIXLY_CORRECT
是,这不仅会ls -s
影响. 如果出于某种原因您已设置但不想使用它,并且您想使用 1024 字节块,则传递with将覆盖它。ls -l
-s
BLOCK_SIZE
ls -s
-k
-s
还有其他方法可以对此进行调整,当同时使用多种方法时会涉及一些微妙之处。有关快速详细信息,请参阅下面的示例和ls(1) (
man ls
)。有关完整的详细信息,请阅读GNU coreutils 手册(也应该在本地提供:runinfo coreutils
),尤其是第2.3 节块大小。ls
例子以下是一些控制单元大小的示例,由 显示
ls
。ls -l
以字节为单位打印大小:ls -s
以 1024 字节块打印大小:添加
-h
到任何一个以人类可读的形式打印它:传递
-l
并-s
预先添加任何-s
会自行显示的内容,而不是影响由以下生成的大小列-l
:添加
-k
到上面显示的命令-s
或-l
不更改输出,因为 GNU ls 已经默认使用 2014 字节块-s
,并且-l
以字节为单位显示大小并且不受-k
. 但是,-k
在更复杂的情况下会产生影响(见下文)。添加导致大小以指定大小的块打印:
--block-size=size-in-bytes
与其他一些选项不同,该选项甚至对通常以字节显示
--block-size
的大小列产生这种影响:ls -l
--block-size
不会被覆盖-k
,即使-k
出现在它之后:(我的示例使用 2 的幂,但操作数
--block-size
不一定是 2 的幂。此外,-s
显然-l
使用不同的舍入规则。)设置
BLOCK_SIZE
环境变量与传递类似的效果--block-size
:--block-size
选项和BLOCK_SIZE
环境变量在效果上的区别在于BLOCK_SIZE
环境变量更经常被选项覆盖。-k
覆盖BLOCK_SIZE
:这适用于
-s
. 但-k
不会覆盖BLOCK_SIZE
由 显示的尺寸-l
,仅仅是因为(如上所述)-k
不会影响:--block-size
也覆盖BLOCK_SIZE
. 由于--block-size
同时影响-s
和-l
,它覆盖BLOCK_SIZE
两者:设置
POSIXLY_CORRECT
环境变量,即使是空字符串,也会导致ls -s
使用 512 字节的块。、和选项会覆盖此效果-h
,而是产生它们指定的行为。但与and不同,它仍然以字节为单位打印大小。-k
--block-size
--block-size
BLOCK_SIZE
ls -l
BLOCK_SIZE
优先于POSIXLY_CORRECT
:影响块大小的选项当然也优先于
POSIXLY_CORRECT
,因为POSIXLY_CORRECT
只是更改默认块大小。特别是,-k
覆盖POSIXLY_CORRECT
:ls
- 其他选项我没有展示相关选项和环境变量的所有组合。
此外,还有两个与 GNU ls 如何选择块大小相关的环境变量:
BLOCKSIZE
(请注意,没有下划线)的行为类似于BLOCK_SIZE
forls -s
但不是ls -l
。它取决于BLOCK_SIZE
何时存在。LS_BLOCK_SIZE
表现类似BLOCK_SIZE
但只影响ls
而不影响du
anddf
。如果两者LS_BLOCK_SIZE
都BLOCK_SIZE
设置了,LS_BLOCK_SIZE
则使用。与其他环境变量一样,这些环境变量优先于
POSIXLY_CORRECT
.如上所述,请参阅GNU coreutils 手册中的第2.3 节块大小以获取更多信息,包括有关这些的详细信息。这本手册,您可以通过在命令行中键入 来阅读,它比coreutils 提供的手册页和其他命令详细得多。
info coreutils
ls