ls -lh と du -h は、トリミングを使用するときに異なるファイルサイズを提供します。

ls -lh と du -h は、トリミングを使用するときに異なるファイルサイズを提供します。

使用ログファイルのサイズを減らす方法を見つけようとしています。

だから、ファイルに対して次のことを試しました。

$ yes > yeslog

したがって、データは継続的に記録されますyeslog

ls -alh yeslog寸法を使用して確認した後、du -h yeslog同じ寸法が報告されました。

truncate -s 0K yeslog次にこれを行い、寸法を再利用して確認します。しかし、今はサイズが小さくなり、以前と同じサイズを見せています。lsduduls

なぜこれが起こるのですか?トリミングは実際に機能しますか?

答え1

これはバリエーションですLinuxはファイルオフセットをどのように管理しますか?lsどちらも正確ですが、du異なるものを測定します。

これを実行すると、truncateファイルはゼロバイトに縮小されます。ただし、yes前の書き込みのオフセットから直ちに書き戻されます。失われたすべてのデータはゼロに置き換えられ、完全に欠落しているブロックはまれに置き換えられます。したがって、ファイルの見かけ上のサイズは増加し続けますが、ディスクが消費する物理ディスク容量は実行されるたびにゼロに戻り、truncate書き込み時に再び増加しても希少ブロックは計算されません。yes

lsduデフォルトでは、消費されたディスク容量の代わりにファイルの見かけのサイズが表示されるため、ls最初のブロック全体が失われた後よりも大きい値が表示されます。フラグを使用して割り当てられたサイズを表示できます。dutruncatels-s

シェルをリクエストすると追加yeslog()に変更すると、以前と同じオフセットから続くのではなく、切り捨てられた後にファイルの先頭からyes >> yeslogファイルが開いて書き込まれますO_APPENDyes

関連情報