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

In7*_*n78 1 ls disk-usage files

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

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

$ yes > yeslog
Run Code Online (Sandbox Code Playgroud)

因此数据被连续写入yeslog。

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

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

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

Ste*_*itt 5

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

\n

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

\n

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

\n

如果您要求 shell追加到yeslog( yes >> yeslog),则文件将以\xe2\x80\x99s 截断后打开O_APPEND并yes从文件开头写入,而不是继续在与之前相同的偏移处写入。

\n