du -b が stat とは異なる結果を表示するのはなぜですか?

du -b が stat とは異なる結果を表示するのはなぜですか?

最近、次のような問題に遭遇しました:

find /tmp/tmp33hn25wv -type f -exec stat --format='%s' {} + | awk '{s+=$1} END {print s}'
10420224

du -bs /tmp/tmp33hn25wv
12198004    /tmp/tmp33hn25wv

結果は一貫して異なります。すべてのファイルはブロック サイズのバイトの倍数で書き込まれます。

どこでやるデュこれらの余分なバイトを見つけますか? ファイル システムがファイルの内容を保存するために多かれ少なかれスペースを必要とする場合があることは理解していますが、その-bオプションはdu、ファイル システムによって使用されるサイズではなく、「見かけの」サイズをカウントする必要があることを意味することを期待していました...

答え1

duディレクトリのサイズが含まれます。条件-type dを追加するとfind、必要な結果が得られる場合があります (私は標準ファイルのみを含むディレクトリ ツリーでこれを行います)。

find /tmp/tmp33hn25wv \( -type f -o -type d \) -exec stat --format='%s' {} + |\
    awk '{s+=$1} END {print s}'

ただし、スペースを占有する他のファイル タイプが存在する可能性があるため、タイプ チェックを完全に省略してみてください。

find /tmp/tmp33hn25wv -exec stat --format='%s' {} + | awk '{s+=$1} END {print s}'

関連情報