Почему du сообщает размер 0 для некоторых непустых файлов на разделе HFS+?

Почему du сообщает размер 0 для некоторых непустых файлов на разделе HFS+?

Чем объясняется эта разница:

$ ls -l /Applications/Safari.app/Contents/Info.plist
-rw-r--r--  1 root  wheel  15730 11 jui 15:02 /Applications/Safari.app/Contents/Info.plist

$ du -sh /Applications/Safari.app/Contents/Info.plist
0B     /Applications/Safari.app/Contents/Info.plist

После того, как файл скопирован в мою домашнюю папку, lsсообщаю duтот же номер.

$ cp /Applications/Safari.app/Contents/Info.plist .
$ du -sh Info.plist; ls -l Info.plist
16K Info.plist
-rw-r--r--  1 ant  staff  15730 17 oct 16:53 Info.plist

Оба каталога находятся на этом разделе ( / )

diskutil  info /
Device Identifier:        disk0s2
Device Node:              /dev/disk0s2
Part of Whole:            disk0
Device / Media Name:      ml2013

Volume Name:              OSX.10.8
Escaped with Unicode:     OSX.10.8

Mounted:                  Yes
Mount Point:              /
Escaped with Unicode:     /

File System Personality:  Journaled HFS+
Type (Bundle):            hfs
Name (User Visible):      Mac OS Extended (Journaled)
Journal:                  Journal size 40960 KB at offset 0xc83000
Owners:                   Enabled

Вот вывод stat:

$ stat  Info.plist
16777218 8780020 -rw-r--r-- 1 root wheel 0 15730 "Oct 17 17:47:12 2013" \ 
"Jun 11 15:02:17 2013" "Jun 11 15:02:17 2013" "Apr 27 11:49:34 2013"\ 
4096 0 0x20 Info.plist

решение1

Возможно, я что-то нашел:

Команда ls в OS X имеет следующий переключатель:

  -O      Include the file flags in a long (-l) output.

Результат:

$ ls -O Info.plist
-rw-r--r--  1 root  wheel  compressed 15730 11 jui 15:02 Info.plist

Я только что проверил (экспериментально), что duвсегда выдает отчеты 0для сжатых файлов HFS+.

Копирование сжатых файлов приводит к их распаковке; поэтому логично, что duпри копировании несжатого файла отображается правильный файл.

Вот объяснение.для поведения du:

Сжатие файлов HFS+

В Mac OS X 10.6 Apple представила сжатие файлов в HFS+. Сжатие чаще всего используется для файлов, установленных как часть Mac OS X; пользовательские файлы обычно не сжимаются (но, безусловно, могут быть сжаты!). Чтение и запись сжатых файлов прозрачны для API файловой системы Apple.

Сжатые файлы имеют пустую вилку данных. Это означает, что криминалистические инструменты, не знающие о сжатии файлов HFS+ (включая TSK до 4.0.0), не увидят никаких данных, связанных со сжатым файлом!

Обсуждение этой темы также содержится в Mac OS X and iOS Internals: To the Apple's Coreстатье Джонатана Левина в главе 16: Быть B(-Tree) или не быть - Файловые системы HFS+.

Такжеafsctoolможет помочь увидеть, какие файлы сжаты в папке.

$ afsctool -v /Applications/Safari.app/
/Applications/Safari.app/.:
Number of HFS+ compressed files: 1538
Total number of files: 2247
Total number of folders: 144
Total number of items (number of files + number of folders): 2391
Folder size (uncompressed; reported size by Mac OS 10.6+ Finder): 29950329 bytes / 34.7 MB (megabytes) / 33.1 MiB (mebibytes)
Folder size (compressed - decmpfs xattr; reported size by Mac OS 10.0-10.5 Finder): 21287197 bytes / 23.8 MB (megabytes) / 22.7 MiB (mebibytes)
Folder size (compressed): 22694835 bytes / 25.2 MB (megabytes) / 24 MiB (mebibytes)
Compression savings: 24.2%
Approximate total folder size (files + file overhead + folder overhead): 26353338 bytes / 26.4 MB (megabytes) / 25.1 MiB (mebibytes)

решение2

При использовании duи сравнении результатов двух разных запусков для файловых систем вам необходимо обязательно использовать переключатель --apparent-size.

Пример

Вот смонтированный ресурс CIFS.

$ du -sh somedir
50M somedir

$ du -sh --apparent-size somedir
45M somedir

выдержка из страницы du man

--apparent-size
          print  apparent  sizes,  rather than disk usage; although the apparent 
          size is usually smaller, it may be larger due to holes in (‘sparse’)
          files, internal fragmentation, indirect blocks, and the like

Так в чем дело?

Это сбивает с толку многих людей, но помните, что когда файлы сохраняются на диске, они занимают блоки пространства, даже если они используют только часть этих блоков. Когда вы работаете duбез , --apparent-sizeвы получаете размер, основанный на объеме используемого пространства блока на диске, а не на фактическом пространстве, потребляемом файлом(ами).

А как насчет размера 0B?

0B /Приложения/Safari.app/Содержание/Info.plist

Скорее всего, это ссылка. Выполнение этой команды покажет, так ли это.

$ ls -l /Applications/Safari.app/Contents | grep Info.plist

решение3

Мой ответ совпадает с ответами других, но я пока не могу комментировать, поэтому начну новый:

Большинство файлов в /Applications сжаты, и при копировании они теряются. При использовании сжатия в HFS+ данные файлов сохраняются в Resource ForkИЛИрасширенный атрибут, если он достаточно мал (менее 4k). Если он находится в ресурсной ветке du (по крайней мере, в Yosemite), он покажет фактическое использование диска в блоках. Если он полностью в атрибуте, он покажет 0.

Связанный контент