ls -lがls -sと異なるサイズを出力するのはなぜですか?


38

次の結果が得られる理由がわかりません。

ls -l 特定のファイル(HISTORY)のサイズが「581944」であることがわかります。

$ ls -l HISTORY 
-rw-rw-r-- 1 waldyrious waldyrious 581944 Feb 22 10:59 HISTORY

ls -s それは「572」だと言う:

$ ls -s HISTORY
572 HISTORY

当然、値に同等のスケールを使用する必要があります。したがって、最初に--block-size 1in ls -lを使用すると、以前と同じ結果が得られることを確認します。

$ ls -l --block-size 1 HISTORY 
-rw-rw-r-- 1 waldyrious waldyrious 581944 Feb 22 10:59 HISTORY

次にls -s、同じスケールで値を取得するために同じことを行います:

$ ls -s --block-size 1 HISTORY 
585728 HISTORY

異なる結果!581944≠585728

を使用して-k、逆の方法で比較可能な値を生成しようとしましたが、次のようになります:

$ ls -lk HISTORY 
-rw-rw-r-- 1 waldyrious waldyrious 569 Feb 22 10:59 HISTORY
$ ls -sk HISTORY 
572 HISTORY

繰り返しますが、異なる結果、569≠572です。

--siを指定して、両方のオプションが同じスケールを使用していることを確認しましたが、役に立ちませんでした。

$ ls -lk --si HISTORY 
-rw-rw-r-- 1 waldyrious waldyrious 582k Feb 22 10:59 HISTORY
$ ls -sk --si HISTORY 
586k HISTORY

...もう一度、異なる値:582k≠586k

私はウェブを検索しようとしましたが、私が見つけることができたのは関連性があると思われる唯一のものはこれでし

一部のファイルには「穴」があるため、ls -s(...)でリストされた使用量はでリストされたファイルサイズよりも小さくなりますls -l

(私の結果では、逆のことが起こることに注意してください:ls -sサイズを返しますがls -l、小さくはありません。)

一方、このページで

Unixファイルホールを検出するエレガントな方法はありません。

それでは、この矛盾にどのように対処できますか?これらの値のどれが正しいと考えられますか?これはおそらくバグlsですか?

回答:


47

短い答え:

  • ls -l ファイルのサイズを指定します(=ファイルに含まれるデータの量)
  • ls -s --block-size 1 ファイルシステム上のファイルのサイズを与える

2つのファイルを作成しましょう。

スパース・ファイル 128の長さをバイト(スパースファイルは、空ブロックを含むファイル、参照あるスパースファイル):

# truncate -s 128 f_zeroes.img
# hexdump -vC f_zeroes.img 
00000000  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
00000010  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
00000020  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
00000030  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
00000040  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
00000050  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
00000060  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
00000070  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
00000080

サイズが128バイトのランダムデータを含む別のファイル:

# dd if=/dev/urandom of=f_random.img bs=1 count=128
# hexdump -vC f_random.img 
00000000  bc 82 9c 40 04 e3 0c 23  e6 76 79 2f 95 d4 0e 45  |...@...#.vy/...E|
00000010  19 c6 53 fc 65 83 f8 58  0a f7 0e 8f d6 d6 f8 b5  |..S.e..X........|
00000020  6c cf 1b 60 cb ef 06 c6  d0 99 c6 16 3f d3 95 02  |l..`........?...|
00000030  85 1e b7 80 27 93 27 92  d0 52 e8 72 54 25 4d 90  |....'.'..R.rT%M.|
00000040  11 59 a2 d9 0f 79 aa 23  2d 44 3d dd 8d 17 d9 36  |.Y...y.#-D=....6|
00000050  f5 ae 07 a8 c1 b4 cb e1  49 9e bc 62 1b 4f 17 53  |........I..b.O.S|
00000060  95 13 5a 1c 2a 7e 55 b9  69 a5 50 06 98 e7 71 83  |..Z.*~U.i.P...q.|
00000070  5a d0 82 ee 0b b3 91 82  ca 1d d0 ec 24 43 10 5d  |Z...........$C.]|
00000080

したがって、16進表記でわかるように、両方のファイルは同じ量のデータを持ってますが、内容はまったく異なります。

次に、ディレクトリを見てみましょう。

# ls -ls --block-size 1 f_*
1024 -rw-r--r-- 1 user user 128 Mar 18 15:34 f_random.img
   0 -rw-r--r-- 1 user user 128 Mar 18 15:32 f_zeroes.img
   ^                         ^
   |                         |
Amount which the           Actual file size
files takes on the fs

最初の値は-s --block-size 1オプションによって指定されます。これは、ファイルシステム上のファイルが使用するスペース量です

ご覧のとおり、ファイルシステム(ext3この場合)はゼロのみを含むことを認識できるほどスマートであるため、スパースファイルはゼロスペースを占有します。また、ランダムデータを含むファイルはディスク上で1024バイトを占有します!

値は、基礎となるファイルシステムがファイルを処理する方法(ブロックサイズ、スパースファイル機能など)によって異なります。

それは-第6列では、あなたがそれを読んでいました場合、ファイルのサイズがあるファイルが含まれているデータの量が、それはだ、両方のファイルのための128のバイト!


1
おそらく、空のファイルまたはヌル値でいっぱいのファイルでさえ、ファイル割り当てテーブルのどこかにスペースを占有しますか?なぜそれをls -s数えないのですか?
フリム

2
ファイルに関するメタデータはiノードに保存されます。各ファイルシステムには、使用できるiノードの数が限られています。ファイルシステムにある空きiノードの数とサイズを確認するには:sudo tune2fs -l /dev/sdaX|grep Inode、またはdf -iすべてのパーティションについて。
-phoibos

1
トレント.partファイルは穴を持つファイルの良い例のように見える:私は面白い、これを検証するための非人工的な方法を見つけls -lsh ~/Downloads/torrents、例えば、私を与えます92K -rw-r--r-- 1 waldir waldir 350M Sep 15 2012 video.avi.part。それは、92Kで、-sオプションによって返され、ファイルは、かかるファイルシステムごと、および350M実際のスペースがあり、-lオプションによって返され、ファイルがフルサイズであるだろう、それが完全にダウンロードされた場合は持っている(つまり、開始から終了までのすべてのバイトがゼロ以外の場合)。lists.freebsd.org/pipermail/freebsd-questions/2012-June/…を
waldyrious

14

ls -sあなたに伝え割り当てられたファイルのサイズ、アロケーションユニットの常に複数を。ls -l実際のサイズを示します。テストする簡単な方法:

$ echo 1 > sizeTest
$ ls -l --block-size 1 sizeTest 
-rw-rw-r-- 1 g g 2 Mär 18 15:18 sizeTest
$ ls -s --block-size 1 sizeTest 
4096 sizeTest
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.