Різниця обчислення розміру каталогу


9

Мені потрібно отримати розмір каталогу в терміналі для цілей підписання. Я використовую таку команду:

du -s /path/to/dir

Я помножую результат на традиційний розмір блоку UNIX (512 байт) і отримую фактичний розмір каталогу в байтах. Однак у діалоговому вікні «Отримати інформацію» Finder показано розмір, трохи менший за розмір, обчислений за допомогою команди терміналу. І здається, що це відтворюється у будь-якій папці / пакеті. Що я пропускаю?

Відповіді:


11

Зазвичай duпоказує інформацію про використання диска (звідки і походить його назва). Майте на увазі це

disk usage != sum of file sizes

Оскільки кожен файл займає ряд блоків у файловій системі (див. man mkfs.ext2Приклад). Це означає, що лише у дуже рідкісній ситуації використання диска файлу дорівнює його фактичному розміру - для цього розмір повинен бути точно кратним розміру блоку.

Розгляньте блоки файлової системи як поля, що містять частини файлів - кожен може містити частину лише одного файлу.

Для GNU версії du, ознайомтеся з --apparent-sizeопцією.


Ще цікавішою може стати ситуація, коли у файловій системі є кілька розріджених файлів !


Немає такої опції (я в ОС X, а не в Linux). Напевно, це потрібно згадати у запитанні, оскільки тегів недостатньо.)
Eimantas,

Ага, правильно ... Тоді подивіться на сторінку та спробуйте знайти посилання на actualабо apparent. (Також дивіться моє оновлене пояснення).
rozcietrzewiacz

2
Правильно, крім нерівності. Розміри файлів іноді можуть бути більшими, ніж фактичне місце на диску, необхідне для їх зберігання. ( unix.stackexchange.com/q/33801/9426 )
Stéphane Gimenez

@ StéphaneGimenez Нічого собі ... дякую, що розповіли!
rozcietrzewiacz

2

Про Mac OS X та Finder (у Snow Leopard, версія 10.6.8) я помітив наступне.

  • Я отримую підрахунок байтів для «кількісно» оцінених фігур Шукаря шляху (файлу чи папки) з кодом (в bash(1)) нижче.
  • Вікна та панель Finder "Info" показує цифри "кількісно" (наприклад, кіло в КБ) у десяткових (базова 10, 1000) байт на відміну від двійкових (база 2, 1024) байт, тож я "кількісно" поділяю на ділення на 1000 і збільшуючи одиничний (байтовий) префікс 'кількісний показник' (величину) і виконайте декілька непарних «відключень ключів». (Мій повний код переповнений коментованим кодом розробки та розділений на кілька файлів (та мов), тому важко ділитися.)
    Наскільки я бачив, мої «кількісні» цифри такі ж, як і «кількісні» цифри в 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)

І тоді я повинен просто каламбур «Виконати шлях і зробити математику»
Мир з і Goodnight fo'real на цей раз.


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 в duякості gdu. Тож це не зовсім портативний, але може бути корисним людям на ОС 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. Альпійське зображення
gadelat
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.