du
изначально предназначен для определения, сколько места занимает файл на носителе (диске).Это основная причина, почему он скорее округляется вверх, чем вниз.Запущенный выделенный блок всегда «используется» полностью, даже если используются только два его байта.
Ваш случай скорее направлен на подсчет байтов в файлах, независимо от занимаемого ими места хранения.Для этого у du
есть опция --apparent-size
.Вместо использования диска он отображает размеры файла.В сочетании с --block-size=1
это проще записать как -b
.
Следующее, что вы хотите конвертировать большое число, например 14204477032
, в аккуратную версию, такую как 13.2GB
.Вы также утверждаете в комментарии, что 14G
(как будет производить -h
) недостаточно точно для вашего вкуса, и вы также предоставляете сценарий awk
, который выполняет именно это преобразование, так что выуже есть работающее решение.
Я не знаю ни одного стандартного инструмента Unix, кроме awk
или даже более сложных вещей, таких как perl
или python
, которые могли бы сделать это намного проще.Есть другие люди, которые ищут решение для этого, и вы один из лучших.
ТАК мой совет: придерживайтесь своего решения.Единственное улучшение, которое я бы предложил, - это использовать сдвиг битов (>> 10
) вместо деления (/ 1024
), но это скорее вопрос вкуса.