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

9

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

du -s /path/to/dir

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

Eimantas
источник

Ответы:

11

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

disk usage != sum of file sizes

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

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

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


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

rozcietrzewiacz
источник
Там нет такой опции (я на 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)

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

Vike
источник
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
Peter.O
источник
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, Альпийское изображение
гаделать