du -hとls -lhの違いは何ですか?


31

各コマンドでさまざまな結果が得られるため、ファイルのサイズを読み取る正しい方法を把握するのは困難です。また、http://forums.devshed.com/linux-help-33/du-and-ls-generated-inconsistent-file-sizes-42169.htmlで次のような投稿を見つけました。

duは、ファイルシステムに存在するファイルのサイズを示します。(IEは常に1024で割り切れる結果を提供します)。

lsはファイルの実際のサイズを提供します。

あなたが見ているのは、ファイルの実際のサイズとそれが取るディスク上のスペースの量の違いです。(ファイルシステム効率とも呼ばれます)。

ファイルシステムに存在するときと、filの実際のサイズの違いは何ですか

回答:


48

これはスラックスペースと呼ばれます

データファイルがファイルシステムが追跡できる最小のデータ単位よりも小さい場合、個々のビットとバイトの上にある抽象化の各層は無駄なスペースをもたらします。セクター、クラスター、またはブロック内のこの無駄なスペースは、一般にスラックスペースと呼ばれ、通常は追加データのストレージに使用できません。個々の256バイトセクターの場合、最大の無駄なスペースは255バイトです。64キロバイトのクラスターの場合、最大の無駄なスペースは65,535バイトです。

したがって、ファイルシステムが64 KBの単位でスペースを割り当て、3 KBのファイルを保存すると、次のようになります。

  • ファイルの実際のサイズは3 KBです。
  • ファイルの常駐サイズは64 KBです。そのユニットの残りの61 KBは別のファイルに割り当てることができず、失われるためです。

:一部のファイルシステムは、ブロックのサブ割り当てをサポートしています。これにより、複数の小さなファイル(または大きなファイルの末尾)を同じブロックに割り当てることで、この問題を軽減できます。


1
それは非常に良い説明です。
SpacemanSpiff

1
@ Handyman5-ありがとうHandyman5。だから私はlsを使用してファイルまたはフォルダのサイズを見ているとき、duは常駐サイズを返している間に実際のサイズを返しますか?あれは正しいですか?ファイルのサイズを見ると、最も正確なのは常駐サイズまたはファイルサイズですか、それとも任意の質問ですか?
PeanutsMonkey

8
@PeanutsMonkey、正確さは見る人の目にあります。;-)基本的に、ファイルがどこか他の場所を占有することを心配している場合(ネットワーク経由でのコピー、zipファイルへの追加、外部ドライブへのバックアップなど)、実際のサイズは気になります。ファイルが現在存在するドライブの空き容量に関心がある場合は、常駐サイズが重要です。isk sage duを表示しているので、現在のドライブで占有されているスペースを調べているため、常駐サイズが表示されます。du
便利屋5

1
@ Handyman5-投稿からほぼ1年が経ちますが、上記の答えが使用時にどのように異なるのdf -hでしょうか?
PeanutsMonkey

1
df残りのブロック数*ファイルシステムのブロックサイズを報告します。この場合du、部分的に使用されているブロックも完全に割り当てられているとみなされるため、のようになります。df基本的にstatvfsを翻訳するので、そのシステムコールを見て、何が起こっているかをよりよく理解することができます。
便利屋

19

ここには、カバーされていない別のオプションがあります - スパースファイルです。この場合は、duシンプルよりも小さいサイズが表示されますls -lので、考えlsていると、ファイルの「サイズ」を報告している見かけ上の(あなたがゼロの全体の多くを望んでいた場合、あなたが読むことができるバイト数)が、サイズduの意志使用中のディスクブロックの実際の数を引き続き使用します。

おもしろいトリック:非常に多くの大きなスパースファイルを作成してから、お使いのディスクスペースの大きさを友人に印象付けます(「ハードドライブに大量の1 TBのファイルを保存しています!」)。OK、多分そんなに楽しくないでしょう。


6

ファイルシステムはブロックで構成されています。ファイルはブロックにきちんと収まる必要はありません。ファイルが1024バイトの場合、ファイルのサイズはlsおよびduで1024になります。ファイルサイズが1025の場合、サイズはlsで1025、duで2048になります。

上記の例では、1024のブロックサイズを想定しています。最近では、より大きなブロックサイズが標準となっています。

ls -l fred
-rw-r--r-- 1 iain users 1024 Jul 13 22:06 fred

du -h fred
8.0K    fred

0

それらが異なるかもしれないもう1つの理由があります。du -hは、別の名前(シンボリックリンクではなくハードリンク)で同じファイルを検出したことを認識し、各ファイルのサイズを報告しますが、共通の親ディレクトリに一度だけサイズを追加します。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.