Почему делает ls-l, производит другой размер от ls-s?

Я не могу выяснить, почему я получаю следующие результаты:

ls -l говорит мне, что размер данного файла (ИСТОРИЯ) "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 1 в 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

Различные результаты! 581 944 ≠ 585728.

Я пытался генерация сопоставимые значения наоборот, с помощью -k, но я добираюсь:

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

Снова, различные результаты, 569 ≠ 572.

Я пытался указать - СИ, чтобы удостовериться, что обе опции использовали тот же масштаб, напрасно:

$ 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?

38
задан 13 March 2019 в 18:26

2 ответа

Короткий ответ:

  • ls -l дает размер файла (= объем данных, который он содержит),
  • ls -s --block-size 1 дает размер файла в файловой системе

Давайте создадим два файла:

Редкий файл 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

Так, как Вы видите в шестнадцатеричном представлении, оба файла имеют тот же объем данных, хотя содержание очень отличается.

Теперь, давайте посмотрим на каталог:

# 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 в этом случае), было достаточно умно, чтобы распознать, что это только содержит, обнуляет. Кроме того, файл со случайными данными поднимает 1 024 байта на диске!

Значение зависит от того, как базовая файловая система рассматривает файлы (размер блока, редкая возможность файла...).

В шестом столбце размер файла, если Вы считали бы его - это - объем данных, который содержит файл, и это - 128 байтов для обоих файлов!

47
ответ дан 13 March 2019 в 18:26

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
0
ответ дан 13 March 2019 в 18:26

Другие вопросы по тегам:

Похожие вопросы: