Можно получить правильный размер файла, используя дю - PullRequest
0 голосов
/ 11 октября 2018

Я вижу, что размер моего сегмента в хранилище aws s3 составляет 13,2 ГБ, и он содержит 1570 файлов:

$ aws s3 ls --summarize --human-readable s3://mybucket/ | grep -E "(Total\sObjects|Total\sSize)"
Total Objects: 1570
   Total Size: 13.2 GiB

Когда я загружал этот сегмент, вот что я вижу:

$du -sh ./test
14G
$wc -l ./test
1570
$ du -sb ./test
14204477032
$ du -sb ./test | awk '{ \
            split( "B KB MB GB" , v ); \
            s=1; \
            while( $1>=1024 ) { \
                $1/=1024; s++ \
            } \
            printf "%.1f%s", $1, v[s] \
        }'
13.2GB

Как добиться того же результата, используя стандартные функции Linux?

Спасибо

1 Ответ

0 голосов
/ 16 октября 2018

du изначально предназначен для определения, сколько места занимает файл на носителе (диске).Это основная причина, почему он скорее округляется вверх, чем вниз.Запущенный выделенный блок всегда «используется» полностью, даже если используются только два его байта.

Ваш случай скорее направлен на подсчет байтов в файлах, независимо от занимаемого ими места хранения.Для этого у du есть опция --apparent-size.Вместо использования диска он отображает размеры файла.В сочетании с --block-size=1 это проще записать как -b.

Следующее, что вы хотите конвертировать большое число, например 14204477032, в аккуратную версию, такую ​​как 13.2GB.Вы также утверждаете в комментарии, что 14G (как будет производить -h) недостаточно точно для вашего вкуса, и вы также предоставляете сценарий awk, который выполняет именно это преобразование, так что выуже есть работающее решение.

Я не знаю ни одного стандартного инструмента Unix, кроме awk или даже более сложных вещей, таких как perl или python, которые могли бы сделать это намного проще.Есть другие люди, которые ищут решение для этого, и вы один из лучших.

ТАК мой совет: придерживайтесь своего решения.Единственное улучшение, которое я бы предложил, - это использовать сдвиг битов (>> 10) вместо деления (/ 1024), но это скорее вопрос вкуса.

...