du が HFS+ パーティション上の空でないファイルのサイズを 0 と報告するのはなぜですか?

du が HFS+ パーティション上の空でないファイルのサイズを 0 と報告するのはなぜですか?

この違いについての説明は何ですか?

$ 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

HFS+ 圧縮ファイルに対してdu常にレポートが行われることを (実験的に) 確認しました。0

圧縮されたファイルをコピーすると、圧縮が解除されます。そのため、論理的には、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 - The HFS+ file systems」に も説明されています。

また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 つの異なる実行の結果を比較する場合は、必ずスイッチを使用する必要があります--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 /アプリケーション/Safari.app/コンテンツ/Info.plist

これはおそらくリンクです。このコマンドを実行すると、リンクであるかどうかがわかります。

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

答え3

私の回答は他の回答と同じですが、まだコメントできないので、新しく始めます。

/Applications 内のほとんどのファイルは圧縮されており、コピーすると失われます。HFS+ で圧縮が使用される場合、ファイルデータはリソースフォークに保存されます。または十分に小さい場合 (4k 未満)、拡張属性になります。リソース フォーク内にある場合、du (少なくとも Yosemite では) は実際のディスク使用量をブロック単位で表示します。属性内に完全に含まれている場合は 0 が表示されます。

関連情報