Mac OS X неправильно сообщает размеры каталогов?

Mac OS X неправильно сообщает размеры каталогов?

В Finder я заметил, что если я дублирую некоторые файлы .app (в папке Applications), Finder покажет, что дубликат файла .app не того же размера, что и оригинал. Это несоответствие размеров файлов происходит не для всех дублируемых файлов .app, но похоже, что чем больше файл .app, тем больше вероятность, что дубликат не будет иметь тот же размер, что и оригинал. Вот несколько примеров:

GarageBand.app - 381.7 MB
GarageBand copy.app - 373.2 MB

iMovie.app - 695.3 MB
iMovie copy.app - 635.4 MB

Install Xcode.app - 1.81 GB
Install Xcode copy.app - 1.57 GB

Теперь я новичок в Mac, и после того, как я заметил эту проблему с несоответствием размеров файлов, я обнаружил, что файлы .app на самом деле не являются файлами — это на самом деле каталоги, но Finder отображает их как файлы. Поэтому я подумал, что, возможно, процесс дублирования не копирует все содержимое исходного каталога .app, и это объясняет разницу в «размере файла». Но затем я загрузил и установил DeltaWalker, который является инструментом сравнения файлов/папок, и DeltaWalker сказал, что дублирующиеся каталоги .app были точно такими же, как исходные каталоги .app. Так что процесс дублирования работал отлично, и поэтому, похоже, проблема в том, что Finder сообщает размеры файлов.

Я также проверил размеры каталогов в Терминале с помощью команды «du», и она также показала расхождения в размерах между исходными и дубликатными каталогами:

du -k /Applications/GarageBand.app/
212868  /Applications/GarageBand.app/

du -k /Applications/GarageBand\ copy.app/
397880  /Applications/GarageBand copy.app/

du -k /Applications/iMovie.app/
629644  /Applications/iMovie.app/

du -k /Applications/iMovie\ copy.app/
700500  /Applications/iMovie copy.app/

du -k /Applications/Install\ Xcode.app/
1771864 /Applications/Install Xcode.app/

du -k /Applications/Install\ Xcode\ copy.app/
1772228 /Applications/Install Xcode copy.app/

Кроме того, это не просто каталоги .app. Я продублировал свой каталог /Developer/Library, и вот что сказал du:

du -k /Developer/Library/
320784  /Developer/Library/

du -k /Developer/Library\ copy/
399868  /Developer/Library copy/

Так может ли кто-нибудь объяснить, почему Mac OS X не сообщает правильно размеры каталогов? Это баг (трудно поверить, что это так просто) или я что-то упускаю (будучи новым пользователем Mac)?

(Я использую Mac OS X Lion 10.7.2)


ОБНОВЛЕНИЕ в ответ на elofturtle:

Самое странное в этом то, что Finder не имеет последовательности. Я просто сделал 2 дубликата GarageBand.app, а затем сделал 2 дубликата одного из дубликатов. Finder отображает каждый дубликат разным размером:

GarageBand.app - 381.7 MB
GarageBand copy.app - 357.6 MB (duplicate of GarageBand.app)
GarageBand copy 2.app - 353.9 MB (duplicate of GarageBand.app)
GarageBand copy 3.app - 378.2 MB (duplicate of GarageBand copy 2.app)
GarageBand copy 4.app - 329.1 MB (duplicate of GarageBand copy 2.app)

Также обратите внимание, что "GarageBand copy 3.app" больше, чем "GarageBand copy 2.app", а "GarageBand copy 4.app" меньше, чем "GarageBand copy 2.app". Это, должно быть, ошибка в Finder.

Вот что говорит «du -k» о каждом из них:

212868  /Applications/GarageBand.app/
397880  /Applications/GarageBand copy.app/
397880  /Applications/GarageBand copy 2.app/
397880  /Applications/GarageBand copy 3.app/
397880  /Applications/GarageBand copy 4.app/

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

решение1

Различия возникли по разным причинам: разные способы подсчета, разные инструменты, сжатие и, что-то похожее на ошибку.

Theпервое отличиепо размеру вы видите, кажется,ошибка в Finder. Размеры файлов, отображаемые Finder, каким-то образом вычисляются в реальном времени и кэшируются в .DS_Storeфайлах. По какой-то причине при копировании большого приложения/папки Finder вычисляет его размер во время процесса копирования и кэширует его, тогда неполный, размер. Затем он показывает этот размер серым в окнах Finder, серый означаетFinder знает, что содержимое изменилось с момента последнего расчета размера, но пока не пересчитал его.

Единственный способ, который я нашел, чтобы он правильно пересчитал размер, — это удалить файл .DS_Storeв папке Application, затем выйти из Finder (например, из Activity Monitor) и снова запустить его (из Dock Icon). Если вы не удалите файл .DS_Store, он все равно останется серым. Может быть, ждеткогда-то(часы, дни, перезагрузка, ...) заставит Finder сделать это самостоятельно.

После этого вы должны увидеть, что все размеры, указанные Finder, одинаковы.

Так что да, похоже, это баг Finder, по крайней мере в OSX Lion (проверено с 10.7.4 здесь, Finder версии 10.7.3). Вы также можете увидетьэта темакоторый сообщает о таком же поведении.

Давайте рассмотрим duинструмент. Сначала я думал, что разница, которую мы видим, может быть объяснена разницей между логическими и физическими размерами копируемых элементов. Логический размер — этонастоящийразмер элемента, то есть каждый бит информации, который он содержит, сложенный вместе. Физический размер — это размер элемента на диске, где каждый бит информации записан в секторе диска.

Например, файл, содержащий один символ, в конечном итоге будет иметь логический размер 1 байт, но физический размер 512 байт или даже 4096 байт при фактической записи на диск. Физический размер обычно больше логического размера (и зависит от фактического размера сектора/блока диска или файловой системы). Этоболее подробно объяснено в этой другой теме. Логический размер может быть больше в случаеразреженные файлы, но HFS+, похоже, не поддерживает такую ​​функцию.

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

Теперь вернемся к Finder. Если вы откроетеполучить данныеокно Приложений, которые вы продублировали, вы увидите, что Finder на самом деле сообщает как Логический, так и Физический размер выбранного вами элемента. Что тогда имеет смысл. Вы даже сможете сравнить Физический размер, сообщенный Finder, и тот, сообщенный , duесли вы немного поработаете над математикой.

Зачем делать какие-то вычисления? Потому что Finder показывает размеры файлов в кБ, МБ или ГБ, тогда как duсообщает их в киБ, МиБ или ГиБ. ЭтоДвоичные префиксы IECкоторые следует использовать для расчета и отображения единиц цифровой информации.

Но, на самом деле, я не уверен, что здесь замешан File Slack, тут что-то ещё. Тома HFS+ допускают сжатие, делается прозрачно, и Apple использует это для оригинальных элементов, установленных ОС. Затем, когда файлы копируются с помощью стандартных инструментов, сжатие больше не используется (по умолчанию, для обеспечения обратной совместимости). Если вы хотите сохранить сжатие для этих файлов, вам нужно использовать команду dittoвместо cpили любого действия Finder. Этообъяснено в этом обзоре.

Вот вывод копирования iTunes.app с использованием разных методов. Вы увидите, что ditto делает приложение точно такого же размера, сохраняя сжатие, где cpнет. И вы даже можете удалить двоичный файл для ненужной вам архитектуры, уменьшив тем самым весь размер):

antoine@amarante:/Applications$ du -ms iTunes.app/
281 iTunes.app/
antoine@amarante:/Applications$ cp -a iTunes.app/ iTunes-copy.app/
antoine@amarante:/Applications$ ditto iTunes.app/ iTunes-ditto.app
antoine@amarante:/Applications$ ditto --arch x86_64 iTunes.app/ iTunes-64.app
antoine@amarante:/Applications$ du -ms iTunes*
236 iTunes-64.app
289 iTunes-copy.app
281 iTunes-ditto.app
281 iTunes.app

Спасибо @DanPritts за его ответна мой дополнительный пост.

решение2

Это ужасный недостаток/баг в OS X. Самый простой способ увидеть его — скопировать большой пакет приложений, затем показать содержимое и удалить огромный файл изнутри. Пространство не восстановится. Файл все еще огромный. Например, если у вас есть пакет приложений размером 3,5 ГБ, вы показываете содержимое, затем удаляете из него 3 ГБ, теперь у вас должно быть приложение с размером файла 500 МБ. Этого не произойдет. Он все еще будет 3,5 ГБ.

решение3

По сути, это лишь предположение, но я вижу два варианта:

  1. Некоторые данные были удалены, но не освобождены в оригинале, и это не копируется. Тем не менее, они отображаются в некоторых поисках использования диска, но не отображаются в других (различные параметры, заданные для du или для того, что OS X использует внутри).
  2. Некоторые данные привязываются к исходному местоположению, и это влияет на воспринимаемый размер в различных инструментах.

Если (1), вы, вероятно, получите другие результаты, сделав третью копию и сравнив копии.

решение4

У меня возникла эта проблема с моим домашним каталогом, когда я переместил его на внутренний жесткий диск после установки Yosemite на SSD. При использовании «Получить информацию» он сообщил неправильный размер всего в 8 ГБ, хотя в строке состояния Finder отображался правильный размер в 240 ГБ. Я исправил это, нажав «Получить информацию» в папке «Пользователи», что затем правильно рассчитало и исправило неправильный размер, сообщаемый домашним каталогом.

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