duはどのように人間が読めるサイズを計算しますか?

duはどのように人間が読めるサイズを計算しますか?

実際のデータを活用した具体例は次のとおりです。du次のように実行すると、/path/to/some/dir次のようになります。

% du -s --bytes /path/to/some/dir
4218593783204   /path/to/some/dir

KB、MB、GBなどの「人が読める」単位でそのサイズを取得したいと思います。

1 KB = 2 ** 10 B
1 MB = 2 ** 20 B
1 GB = 2 ** 30 B
1 TB = 2 ** 40 B
1 PB = 2 ** 50 B
1 EB = 2 ** 60 B

この例では、人間が読むことができる必須単位は1TBなので、上記の規則に従って元の4218593783204バイトは次のように変換されます。

% printf -- "%f TB\n" $(( 4218593783204.0 / 2 ** 40 ))
3.836789 TB

duだから同様の結果を探しています3.8T。今まではそんなに良くなった。

問題は、呼び出し時にdu3.8T付近に報告されている人が読めるサイズを見つけることができないことです。代わりに私はこれを得ます:

% du -sh /path/to/some/dir
5.3T    /path/to/some/dir
% du -s --si /path/to/some/dir
5.8T    /path/to/some/dir
% du -s --block-size=$(( 2 ** 40 )) /path/to/some/dir
6   /path/to/some/dir

(上記の最後の切迫した試みであることを使用したことは、うまくいっても悲惨なほど不適切であること--block-sizeに注意してください。

私はこの結果を見て混乱しています。マニュアルの内容はdu次のとおりです。

       -h, --human-readable
              print sizes in human readable format (e.g., 1K 234M 2G)

       --si   like -h, but use powers of 1000 not 1024

...これは何が起こっているのか理解するのに全く役に立ちません。

尋ねる:du上記の最後の3つのコマンドが5.3T、5.8T、6という数字をどのように生成するかを説明できますか?

関連情報