Неожиданное поведение с флагом -h передано du

263
Slater Victoroff

Пока я жил в мире * nix, я придерживался предположения, что когда команда принимает -hфлаг, единственное, что я изменял, - это эффективное форматирование оператора печати. Я обычно не пересматриваю это, но определенно нашел, что это имеет место вообще.

Сегодня у меня был очень странный опыт измерения размера каталога, в который я активно писал.

>>> du -s 15565160 . >>> du -sh 7.4G . 

Сначала я подумал, что просто ловлю каталог в странном месте, но обнаружил, что оба значения были достаточно постоянными, возвращая только слегка увеличенные / уменьшенные значения, пока я продолжал писать в каталог. Мое первое предположение состояло в том, что это было какое-то странное промежуточное состояние, но в этом случае я бы ожидал резких колебаний в результате du -s, которых я не наблюдал.

Что тут происходит? Какой 155...номер? Не похоже, что это байты. Кажется, между этими двумя значениями есть примерно одинаковое соотношение, равное 450. То есть, если я умножу результат du -sна 450, я получу довольно близкое число байтов, подразумеваемых du -sh.

Большой вопрос, если я был неправ все время. Почему добавление -hфлага в этом контексте делает что-то кроме изменения формата печати?

0

1 ответ на вопрос

4
Cliff Armstrong

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

duпо умолчанию возвращает количество логических блоков, которые каталог и его содержимое занимают на носителе. Количество занятых блоков полезно для многих дисковых утилит и сценариев ... но не очень "читабельно". Флаг -h преобразует количество блоков обратно в число байтов, а затем округляет до ближайшего коэффициента 1024 (и нескольких других махинаций ... мы получаем гигабайты и одну цифру после десятичной дроби в вашем случае).

Учитывая то, что вы сказали, я готов поспорить, что ваша система настроена на размер блока 512 байт, потому что:

15565160 * 512 / 1024^3

Важно отметить, что duпредполагается, что размер блока равен (по порядку) значению, установленному --block-size=флагом, значению DU_BLOCK_SIZE, BLOCK_SIZEили BLOCKSIZEпеременным среды, или 1024. 1024 байта - это общий размер блока по умолчанию, используемый большинством современных файловых систем. Но 512-байтовые блоки не особенно редки. Проверьте эти переменные, одна из которых, вероятно, установлена ​​на 512. Или у вас может быть особенно старая версия du.

Это объясняет это! Спасибо. Даже не подозревал, что дю по умолчанию установил размер блока. Предполагается, что байты из ls были последовательными, но явно ошибочным предположением Slater Victoroff 6 лет назад 0

Похожие вопросы