Mac OS X 没有正确报告目录大小?

Mac OS X 没有正确报告目录大小?

在 Finder 中,我注意到如果我复制一些 .app 文件(在“应用程序”文件夹中),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

差异来自不同的原因:不同的计数方式、不同的工具、压缩以及看起来像是错误的东西。

一阶差分你看到的尺寸似乎是一个Finder 中的错误。Finder 显示的文件大小以某种方式实时计算并缓存在.DS_Store文件中。出于某种原因,在复制大型应用程序/文件夹时,Finder 会在复制过程中计算其大小并缓存当时不完整的大小。然后它在 Finder 窗口中将该大小显示为灰色,灰色表示Finder 知道内容自上次计算大小以来已经发生了变化,但它还没有重新计算

我发现让它重新正确计算大小的唯一方法是删除.DS_Store应用程序文件夹中的文件,然后退出 Finder(例如从活动监视器中)并重新启动它(从 Dock 图标中)。如果你不删除该.DS_Store文件,它仍然会保持灰色。也许等待一些时间(小时,天,重启,...)将使 Finder 自行执行此操作。

此后,您应该会看到 Finder 报告的所有尺寸都是相同的。

所以是的,这看起来像是 Finder 的一个错误,至少在 OSX Lion 中是这样的(这里测试的是 10.7.4,Finder 版本是 10.7.3)。您还可以看到此主题报告了相同类型的行为。

然后,让我们考虑一下这个du工具。起初,我认为我们看到的差异可以通过复制项目的逻辑大小和物理大小之间的差异来解释。逻辑大小是真实的项目的大小,即其中包含的每一位信息的总和。物理大小是磁盘上项目的大小,其中每个信息位都写在磁盘扇区上。

例如,一个包含单个字符的文件最终将具有 1 字节的逻辑大小,但实际写入磁盘时物理大小为 512 字节甚至 4096 字节。物理​​大小通常大于逻辑大小(取决于磁盘或文件系统的实际扇区/块大小)。这是在另一个线程中更详细地解释. 逻辑大小可能更大的情况下稀疏文件,但HFS+好像不支持这样的功能。

du只显示物理大小(你可以告诉它 BLOCKSIZE 是什么)。你可以看到报告的大小du总是比原始大小大(或者,在例外情况下,相同)。这是因为文件系统和磁盘空间碎片。当你复制一个文件(实际上这里是一堆文件,因为应用程序是一个目录)时,磁盘上会分配新的扇区,并且,随着碎片化发生,使用的方块数量通常高于原始物品的数量。有些人称之为文件松弛

现在,回到 Finder。如果您打开获取信息在复制的应用程序窗口中,您会看到 Finder 实际上报告了所选项目的逻辑大小和物理大小。这很有意义。du如果您进行一些数学运算,您甚至可以比较 Finder 报告的物理大小和报告的物理大小。

为什么要做数学题?因为 Finder 显示文件大小的单位是 kB、MB 或 GB,而du报告的单位是 kiB、MiB 或 GiB。这些是IEC 二进制前缀用于计算和显示数字信息的单位。

但实际上,我不确定这里是否涉及 File Slack,还有其他东西。 HFS+ 卷允许压缩,透明地完成,Apple 将其用于操作系统安装的原始项目。然后,当使用标准工具复制文件时,不再使用压缩(默认情况下,为了向后兼容)。如果您想保留这些文件的压缩,您需要使用命令ditto而不是cp或任何 Finder 操作。这是在这篇评论中解释

以下是使用不同技术复制 iTunes.app 的输出。您会看到 ditto 使应用程序的大小完全相同,保留了压缩,而cp没有。您甚至可以删除不需要的 arch 的二进制文件,然后减小整个大小):

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.5GB 的应用程序包,您显示内容,然后从中删除 3GB,您现在应该有一个文件大小为 500MB 的应用程序。但事实并非如此。它仍然是 3.5GB。

答案3

这基本上是一种猜测,但我看到两种可能性:

  1. 一些数据已被删除,但原始数据中尚未释放,因此这些数据未被复制。然而,这些数据出现在一些磁盘使用情况搜索中,但在其他搜索中没有出现(du 或 OS X 内部使用的任何参数不同)。
  2. 一些数据与原始位置相链接,这会影响不同工具中感知的大小。

如果是 (1),那么在制作第三份副本并比较副本时可能会得到不同的结果。

答案4

在 SSD 上安装 Yosemite 后,我将 Home Directory 移到内置 HDD 上时,出现了这个问题。使用“获取信息”时,它报告了错误的大小(只有 8GB),尽管 Finder 的状态栏中显示的正确大小是 240GB。我通过单击“用户”文件夹上的“获取信息”解决了这个问题,然后正确计算并修复了 Home Directory 报告的错误大小。

相关内容