为什么 .dylib 文件的物理大小小于其逻辑大小?

Læt*_*æti 5 libraries macos

OSX Lion 中有一个我无法解释的行为(也可能在其他版本上)。

当我复制某些包含动态库的应用程序(例如 iTunes)时,这些库的物理大小会发生变化(大小会增加)。这可能是由于磁盘碎片造成的。但不仅如此,因为令人惊讶的是原始物理大小小于逻辑大小(通常物理大小总是大于逻辑大小,除非涉及压缩)。

为了说明我的情况:

antoine@amarante:/Applications$ ls -ls iTunes.app/Contents/MacOS/libgnsdk_submit.1.8.2.dylib 
384 -rwxrwxr-x+ 1 root  admin  558704  8 jul  2011 iTunes.app/Contents/MacOS/libgnsdk_submit.1.8.2.dylib
Run Code Online (Sandbox Code Playgroud)

ls考虑 512 字节的块大小,与报告的 558704 字节逻辑大小相比,384 个块构成 196608 字节。或者,如Finder 中的获取信息窗口所示:

558.704 octets (197 Ko sur disque)
Run Code Online (Sandbox Code Playgroud)

在我复制整个 iTunes 应用程序的一些复制操作后也会显示这一点。第一个iTunes copie是通过 Finder 完成的复制,iTunes-cp也是使用 CLI 命令完成的复制cp -a

antoine@amarante:/Applications$ ls -ls iTunes*.app/Contents/MacOS/libgnsdk_dsp.1.8.2.dylib 
11632 -rwxr-xr-x+ 1 antoine  admin  5955104  8 jul  2011 iTunes copie.app/Contents/MacOS/libgnsdk_dsp.1.8.2.dylib
11632 -rwxrwxr-x+ 1 antoine  admin  5955104  8 jul  2011 iTunes-cp.app/Contents/MacOS/libgnsdk_dsp.1.8.2.dylib
 3944 -rwxrwxr-x+ 2 root     admin  5955104  8 jul  2011 iTunes.app/Contents/MacOS/libgnsdk_dsp.1.8.2.dylib
Run Code Online (Sandbox Code Playgroud)

我们看到复制的文件的物理大小(11632*512 = 5955584 字节)大于逻辑大小(5955104),但原始文件小得多。.dylib当我单独复制单个文件时,行为是相同的。少数动态库文件会发生这种情况,但并非所有动态库文件都会发生这种情况。

原始库文件怎么会比副本小呢?是否涉及一些压缩?或者我的原始文件是否以某种方式损坏了?我该如何检查?

Dan*_*tts 6

事实上,Mac 10.6 及更高版本的 HFS+ 中存在压缩功能。它是透明的,甚至很难用标准操作系统工具检测到。

而且,这并不总是能完成。为了向后兼容,默认情况下不压缩,但它们在安装操作系统时会对其进行压缩。

工具列表,以防链接损坏:

  • hfsdebug
  • afsctool
  • stat -f %f- 报告文件上的“用户标志” - 标志之一表示压缩。我在压缩文件上得到“32”,在未压缩文件上得到“0”。可能 32 映射到一个位字段。
  • ditto - 支持写入压缩文件

  • 感人的。谢谢你的回答,今天我真的学到了一些东西!使用“ditto”命令将复制并保留压缩,从而产生相同的大小。 (2认同)
  • 这次讨论让我脑海中的两块石头碰在一起。小型 SSD 最近已经填满了...我发现了这个:https://github.com/jrk/afsctool 它将报告 hfs 压缩,并且还会就地压缩文件。sudo afsctool -ckv /Applications 我又回来了 4 场演出。 (2认同)