使用截断时 ls -lh 和 du -h 给出不同的文件大小

使用截断时 ls -lh 和 du -h 给出不同的文件大小

我正在尝试找到一种方法来减少使用日志文件的大小。

所以对于一个文件我尝试了这个:

$ yes > yeslog

因此数据被连续写入yeslog

ls -alh yeslog在我用和检查尺寸后du -h yeslog,他们报告了相同的尺寸。

然后我这样做,然后我再次使用和truncate -s 0K yeslog检查尺寸。但现在,显示的是缩小的尺寸,而显示的是和以前一样的尺寸。lsduduls

为什么会发生这种情况? truncate 真的发挥了作用吗?

答案1

这是一个变体linux如何管理文件的偏移量。和ls都是du正确的,它们测量的是不同的东西。

当您运行时truncate,它会将文件减少到 0 字节。但是,yes立即在之前写入的偏移量处再次写入;所有丢失的数据都被零替换,并且完全丢失的块被稀疏地替换。因此,文件的表观大小不断增加,但每次运行时,它在磁盘上消耗的实际磁盘空间都会回到 0 ,并且虽然在写入truncate时再次增加,但稀疏块不被计算在内。yes

ls默认情况下显示文件的表观大小,而du显示消耗的磁盘空间,因此将显示比第一个丢失整个块之后ls更大的值。您可以使用标志来显示分配的大小。dutruncatels-s

如果你要求 shell附加to yeslog( yes >> yeslog),则文件将被打开O_APPENDyes在截断后从文件的开头写入,而不是继续在与之前相同的偏移处写入。

相关内容