![为什么 du 报告 HFS+ 分区上某些非空文件的大小为 0?](https://linux22.com/image/51289/%E4%B8%BA%E4%BB%80%E4%B9%88%20du%20%E6%8A%A5%E5%91%8A%20HFS%2B%20%E5%88%86%E5%8C%BA%E4%B8%8A%E6%9F%90%E4%BA%9B%E9%9D%9E%E7%A9%BA%E6%96%87%E4%BB%B6%E7%9A%84%E5%A4%A7%E5%B0%8F%E4%B8%BA%200%EF%BC%9F.png)
差异的解释是什么:
$ 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
我可能发现了一些东西:
OS X 上的 ls 命令有这个开关:
-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+ 压缩文件。
复制压缩文件并解压它们; so 逻辑上du
报告复制的未压缩文件上的正确文件。
这是一个解释对于以下行为du
:
HFS+ 文件压缩
在 Mac OS X 10.6 中,Apple 在 HFS+ 中引入了文件压缩。压缩最常用于作为 Mac OS X 一部分安装的文件;用户文件通常不被压缩(但当然可以!)。就 Apple 的文件系统 API 而言,读取和写入压缩文件是透明的。
压缩文件有一个空的数据叉。这意味着不支持 HFS+ 文件压缩(包括 4.0.0 之前的 TSK)的取证工具将看不到与压缩文件关联的任何数据!
Mac OS X and iOS Internals: To the Apple's Core
Jonathan Levin 在第 16 章:To B(-Tree) or not to be - HFS+ 文件系统中 也对此主题进行了讨论。
还AFSC工具可以帮助查看文件夹中压缩了哪些文件。
$ 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
,您要比较针对文件系统的 2 次不同运行的结果,您需要确保使用 switch --apparent-size
。
例子
这是 CIFS 安装的共享。
$ du -sh somedir
50M somedir
$ du -sh --apparent-size somedir
45M somedir
摘自 du 手册页
--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 /Applications/Safari.app/Contents/Info.plist
这很可能是一个链接。执行此命令将显示是否是这种情况。
$ ls -l /Applications/Safari.app/Contents | grep Info.plist
答案3
我的答案与其他人一致,但我还不能发表评论,所以我要开始新的:
/Applications 中的大多数文件都经过压缩,当您复制它时,这些文件就会丢失。当在 HFS+ 中使用压缩时,文件数据存储在资源叉中或者如果它足够小(小于 4k),则为扩展属性。如果它在资源分叉中,du(至少在 Yosemite 上)将显示它的实际磁盘使用情况(以块为单位)。如果它完全在属性中,它将显示 0。