macOSはターミナルからファイルの「割り当てられたサイズ」を取得しますか?

2
2022.03.04

私はmacOS12.2.1を実行しているMacbookProを使用しています(APFSファイルシステムを使用しています)。

mkfileユーティリティを使用して大きな「ダミーファイル」を作成すると、奇妙な動作に気づきました。 ( /usr/sbin/mkfile

次のコマンドで5GBのファイルを作成しました。

 mkfile -n 5g test.txt

次に、それが機能することを確認するために、 duコマンドを実行しました。 ( /usr/bin/du )。

 du -hs ./test.txt

しかし、私は予期しない結果を得ました:

 4.0K    ./test.txt

Finderでファイルに移動し、ファイル情報を確認したところ、2つの異なるサイズがあることがわかりました。Top line highlighted displays the size as 5 Gigabytes. However, further down it displays the text: "4 KB on disk"

さらに掘り下げた後、 mkfileのmanページでこの情報を見つけました。

 OPTIONS
     -n     Create an empty filename.  The size is noted, but disk blocks aren't
            allocated until data is written to them.

知りたかったのですが、割り当てられたファイルサイズを確認できるコマンドはありますか?

回答
1
2022.03.06

割り当てられたファイルサイズとファイルシステムによって報告されたファイルサイズの表示

次のコマンドを使用して、割り当てられたファイルサイズ、つまり、ファイルシステムでtest.txtが占めるディスク容量を表示できます。

 du -h test.txt

対照的に、ファイルシステムによって報告されるファイルサイズは、割り当てられたファイルサイズと一致する場合と一致しない場合があります。表示するには、次のコマンドを使用します。

 ls -l test.txt

(ファイルサイズを読みやすくしたい場合は、代わりにls -lh test.txtを使用できます。)

スパースファイル

なぜtest.txtは4KBのディスクスペースしか使用しないのに、ファイルシステムはそのサイズが5GBであると報告しているのですか?

これは、(ほとんどの)ファイルシステムが提供する巧妙な機能です。データを含まないファイルを作成するために時間とディスクスペースを費やす代わりに、空のファイルを作成し、そのメタデータを5BGのサイズを報告するように設定する方が効率的です。実際のデータがファイルに追加されるときにディスクスペースを割り当てます。

そして、それがmkfile-nオプションのすべてです。

  • mkfile -nを使用する場合は、スパースファイルを作成します。これは、座席を予約せずに列車の切符を購入するのと多少似ています。鉄道会社はあなたのために座席を予約しません(つまり、座席は割り当てられません)。

  • ただし、 -nオプションなしでmkfileを使用する場合は、次のようになります。

     mkfile 5g test.txt
    

    列車の切符を購入して座席を予約するのと同じように、ファイルが作成され、5 GBが割り当てられます。座席はあなたのために予約され、あなた以外の誰もそれを使用できません(つまり、座席が割り当てられます)。

要約すると、ファイルを作成するとき、ディスク容量は次のいずれかになります。

  • 割り当てられる(つまり、他のファイルが使用できないようにファイルシステムで予約される)。これにより、たとえば、ファイルが断片化されるのを防ぐことができます。
  • または、ディスクスペースを割り当てないように要求することもできます。これにより、スパースファイルが作成されます。スパースファイルは、データが含まれている場合にのみディスク領域を占有するため、効率的です。

コメントでnohillsideが指摘しているように、 ddを使用して、スパースファイルをデータで「埋める」ことができます。次に例を示します。

 dd if=/dev/zero of=test.txt bs=1024k count=5120

割り当てられたファイルサイズとファイルシステムによって報告されたファイルサイズが一致するようにします。

スパースファイルの詳細については、 https://en.wikipedia.org/wiki/Sparse_fileを参照してください。