24

アーカイブしているディレクトリがあります:

$ du -sh oldcode
1400848
$ tar cf oldcode.tar oldcode

したがって、ディレクトリは1.4GBです。ただし、ファイルは大幅に小さくなっています。

$ ls -l oldcode.tar
-rw-r--r-- 1 ieure ieure 940339200 2002-01-30 10:33 oldcode.tar

わずか897MB。それは決して圧縮されていません:

$ file oldcode.tar
oldcode.tar: POSIX tar archive

tar ファイルがその内容よりも小さいのはなぜですか?

4

5 に答える 5

46

ファイルシステムの仕組みにより、違いが生じます。

簡単に言えば、ディスクはクラスターで構成されています。各クラスタのサイズは、たとえば 4 キロバイトに固定されています。このようなクラスターに 1kb のファイルを保存すると、3kb が使用されなくなります。正確な詳細は、使用するファイル システムの種類によって異なりますが、ほとんどのファイル システムはそのように機能します。

3kb の無駄なスペースは 1 つのファイルでは大した量ではありませんが、非常に小さなファイルが多数ある場合、無駄なスペースがディスク使用量の重要な部分になる可能性があります。

tar アーカイブ内では、ファイルはクラスターに保存されず、次々に保存されます。そこから違いが生まれます。

于 2009-01-30T20:14:18.273 に答える
4

どの tar を使用しているか、またはどの種類の Unix システムを使用しているかがわからないので、ここに私の推測を示します。古いコードには多数の小さなファイルが含まれており、ディスク領域は何らかのブロックによって割り当てられるため、ディスク領域が非効率的に使用されます。 、バイトごとではなく。tar ファイルでは、それらは連結され、割り当てられたディスク容量を最大限に活用します。

于 2009-01-30T20:14:29.320 に答える
3

2つの可能性があります。

小さなファイル

ほとんどの場合、それはその内容よりも小さくはありません。Nils Pipenbrinckが書いたように、ファイルシステムが割り当てるスペースの量をdu表示します。ファイルはファイルシステムブロックに格納されるため、ファイルの論理サイズよりも大きくなります。

ファイルの論理サイズを表示するには、を使用しますdu --apparent-size。この場合、結果はtarファイルよりも小さくなります。

スパースファイル

tarファイルはスパースファイルを保存できます。tarballがを使用して作成された場合--sparse、スパースファイルの穴が記録されるため、tarballはファイルの論理サイズよりも小さくなる可能性があります。

抽出したコピーのスパース情報が何らかの理由で失われた場合(たとえば、スパースファイルをサポートしていないファイルシステムにtarballを抽出した場合、またはzipしてから解凍した場合など)、df展開されたサイズが報告されます。

于 2013-01-19T04:39:26.007 に答える
3

これは、ファイルシステムのブロックサイズと関係があります。MacOSX 10.5.6 のman 1 duは次のように述べています。

du ユーティリティは、各ファイル引数、および各ディレクトリ引数をルートとするファイル階層内の各ディレクトリのファイル システムブロックの使用状況を表示します。ファイルが指定されていない場合は、現在のディレクトリをルートとする階層のブロック使用状況が表示されます。

[mirko@borg foo]$ ls -la
total 0
drwxr-xr-x   2 mirko  wheel   68 Jan 30 21:20 .
drwxrwxrwt  10 root   wheel  340 Jan 30 21:16 ..
[mirko@borg foo]$ du -sh
0B  .
[mirko@borg foo]$ touch foo
[mirko@borg foo]$ ls -la
total 0
drwxr-xr-x   3 mirko  wheel  102 Jan 30 21:20 .
drwxrwxrwt  10 root   wheel  340 Jan 30 21:16 ..
-rw-r--r--   1 mirko  wheel    0 Jan 30 21:20 foo
[mirko@borg foo]$ du -sh
0B  .
[mirko@borg foo]$ echo 1 > foo
[mirko@borg foo]$ ls -la
total 8
drwxr-xr-x   3 mirko  wheel  102 Jan 30 21:20 .
drwxrwxrwt  10 root   wheel  340 Jan 30 21:16 ..
-rw-r--r--   1 mirko  wheel    2 Jan 30 21:20 foo
[mirko@borg foo]$ du -sh
4.0K    .

ご覧のとおり、2 バイトのファイルでも 4kb のブロック全体を使用します。ブロックのサブアロケーションによるスペースの浪費を回避するファイルシステムがいくつかあります。

于 2009-01-30T20:33:54.537 に答える
0

du は、ファイル サイズ duder ではなく、ディスク ブロックをカウントします。

于 2009-01-30T20:13:43.673 に答える