Разница в расчете размера каталога


9

Мне нужно получить размер каталога в терминале для подписи. Я использую следующую команду:

du -s /path/to/dir

Я умножаю результат на традиционный размер блока UNIX (512 байт) и получаю фактический размер каталога в байтах. Тем не менее, диалоговое окно Finder «Get Info» показывает размер, немного меньший, чем тот, который рассчитывается с помощью команды терминала. И кажется, что это воспроизводимо на любой папке / связке. Что мне не хватает?

Ответы:


11

Обычно duпоказывает информацию об использовании диска (отсюда и его название). Имейте в виду, что

disk usage != sum of file sizes

Потому что каждый файл занимает несколько блоков в файловой системе (см., man mkfs.ext2Например). Это означает, что только в очень редкой ситуации использование файла файлом на диске равно его фактическому размеру - для этого размер должен быть точно кратным размеру блока.

Представьте себе блоки файловой системы как блоки, содержащие части файлов - каждый может содержать часть только одного файла.

Для версии GNU du, проверьте --apparent-sizeопцию.


Еще более интересная ситуация может возникнуть, когда в файловой системе есть несколько редких файлов !


Там нет такой опции (я на OS X, а не Linux). Вероятно, нужно упомянуть об этом в вопросе, поскольку тега недостаточно.)
— Eimantas

Ах, да ... Тогда посмотрите на страницу руководства и попробуйте найти ссылки на actualили apparent. (Также см. Мое обновленное объяснение).
— rozcietrzewiacz

2
Правильно за исключением неравенства. Размеры файлов иногда могут превышать фактическое дисковое пространство, необходимое для их хранения. ( unix.stackexchange.com/q/33801/9426 )
— Стефан Гименес,

@ StéphaneGimenez Wow ... спасибо, что сказал мне!
— rozcietrzewiacz

2

О Mac OS X и Finder (в Snow Leopard, версия 10.6.8) я заметил следующее.

  • Я получаю количество байтов для «количественных» показателей Finder пути (файла или папки) с кодом (в bash(1)) ниже.
  • В окне и панели «Информация» Finder отображаются «количественные» (например, килограммы в КБ) цифры в десятичных (основание 10, 1000) байтах, в отличие от двоичных (основание 2, 1024) байтов, поэтому я «количественно» делю на 1000 и увеличивая единицу (байт) префикса 'quantifier' (величину) и сделайте некоторое странное округление "без ключа". (Мой полный код полон закомментированного кода разработки и разделен на несколько файлов (и языков), поэтому его сложно разделить.)
    Насколько я видел, мои «количественные» цифры совпадают с «количественными» показателями в Finder. ,
  • Кроме того, наряду с кодом я хочу сказать, что у меня нет (и никогда не было) переменной окружения, BLOCKSIZEустановленной в моей оболочке, но я протестировал (сейчас немного) обе версии и значения по умолчанию для $BLOCKSIZEдает одинаковые значения.

#!/usr/bin/env bash
#tab-width:4
                                 du -s                      "${@:-.}"   |awk '{u+=$1}END{   print  u*'${BLOCKSIZE:-0512}'   }'||exit $?         #macosx  (xnu)
#                               gdu -sB${BLOCKSIZE:-4096}   "${@:-.}"   |awk '{u+=$1}END{   print  u*'${BLOCKSIZE:-4096}'   }'||exit $?         #macports gnu

  • Неуказанное число мне не удалось сопоставить.
    Единственное, что я могу сказать, это то, что я становлюсь ближе, считая только файлы (таким образом исключая каталог ~ 'мета-индекс / заголовок файловой системы' ~ данные), и что ближе всего я получаю следующее.

#!/usr/bin/env bash
#tab-width:4
    for a;do find "$a" -type f -print0|xargs -0      stat -f %z         |awk '{u+=$1}END{   print  u                        }'||exit $?;done    #macosx  (xnu)
#   for a;do find "$a" -type f -print0|xargs -0     gstat -c %s         |awk '{u+=$1}END{   print  u                        }'||exit $?;done    #macports gnu
  • Кажется, что ни (xnu) du(1), ни (gnu) gdu(1) не учитывают расширенные атрибуты ( xattr)

И тогда я должен просто каламбур "
Пройди путь и посчитай " Мир и спокойной ночи на этот раз.


1

В моей системе Ubuntu, используя ext4, du -b fileдает размер в байтах фактического файла и du -b dirдает размер в байтах файла (ов) + служебные данные каталога. В моем случае накладные расходы кратны 4096 байтам.

Эти издержки увеличиваются с увеличением количества файлов.
Примечание: даже если файлы удалены, издержки каталога остаются на более высоком уровне, чем до удаления файлов.

Я не пробовал перезагружаться, чтобы посмотреть, не восстановится ли он, но в любом случае это означает, что размер каталога меняется в зависимости от исторических обстоятельств.

Подсчет каждого размера файла может быть лучшим вариантом для точного значения общих размеров файлов .

Следующий скрипт суммирует все размеры файлов (в байтах).

Для OS X, если у вас нет -bопции «du», вы можете использовать statвместо этого (если у вас есть :) ... Строка с комментариями показывает statальтернативу Ubuntu du -b;

unset total
while IFS= read -r -d $'\0' rf; do
  # (( total += $(stat  "$rf" | sed -nre 's/^  Size: ([0-9]+).*/\1/p') ))
    (( total += $(du -b "$rf" | cut -f 1) ))
done < <(find  . -type f  -name '*' -print0)
echo $total

2
OSX не имеетdu -b и другойstat . Ваш сценарий не переносим вне Linux в любом случае.
— Жиль "ТАК ... перестать быть злым"

С MacPorts на OS X вы можете установить, coreutilsчтобы получить версию GNU duas gdu. Так что это не совсем переносимо, но может быть полезно для людей на OS X, чтобы получить версии GNU нескольких основных утилит.
— drfrogsplat

1

Суммируйте все файлы в каталоге:

OSX: find dir ! -type d -print0 | xargs -0 stat -f '%z' | awk '{sum += $1} END{print sum}'

Linux: find dir ! -type d -printf "%s\n" | awk '{sum += $1} END{print sum}'


find: unrecognized: -printf, Альпийское изображение
— гаделать
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.