我正在尝试找到一种方法来减少使用日志文件的大小。
所以对于一个文件我尝试了这个:
$ yes > yeslog
因此数据被连续写入yeslog
。
ls -alh yeslog
在我用和检查尺寸后du -h yeslog
,他们报告了相同的尺寸。
然后我这样做,然后我再次使用和truncate -s 0K yeslog
检查尺寸。但现在,显示的是缩小的尺寸,而显示的是和以前一样的尺寸。ls
du
du
ls
为什么会发生这种情况? truncate 真的发挥了作用吗?
答案1
这是一个变体linux如何管理文件的偏移量。和ls
都是du
正确的,它们测量的是不同的东西。
当您运行时truncate
,它会将文件减少到 0 字节。但是,yes
立即在之前写入的偏移量处再次写入;所有丢失的数据都被零替换,并且完全丢失的块被稀疏地替换。因此,文件的表观大小不断增加,但每次运行时,它在磁盘上消耗的实际磁盘空间都会回到 0 ,并且虽然在写入truncate
时再次增加,但稀疏块不被计算在内。yes
ls
默认情况下显示文件的表观大小,而du
显示消耗的磁盘空间,因此将显示比第一个丢失整个块之后ls
更大的值。您可以使用标志来显示分配的大小。du
truncate
ls
-s
如果你要求 shell附加to yeslog
( yes >> yeslog
),则文件将被打开O_APPEND
并yes
在截断后从文件的开头写入,而不是继续在与之前相同的偏移处写入。