LinuxForum.Fans
Тема

Вопрос по ls

Автор: denbat75 15 сообщений 998 просмотров
20.07.2017 11:21 #424422

Добрый день!

Это, наверное, простой вопрос, но с разбегу нагуглить не смог.
Предположим, я создал в Linux (Ubuntu) новую папку и перешёл в неё.
После команды "ls -la" вижу в первой строке: "total 8" и закономерно лишь 2 элемента каталога (точка и две точки).
Вопрос: откуда берётся 8?

20.07.2017 11:45 #424423

каталоги место тоже занимают, что замечательно показывает ls -l

20.07.2017 13:41 #424425

Безусловно занимают какое-то место. Однако, мы не про него, а про количество элементов каталога, если я правильно понимаю. Так вот, откуда берётся 8? Почему 8, а не 2, например?

20.07.2017 13:45 · отредактировано #424426

8 -- это не количество элементов, это занимаемое ими место, как выше уже сказали.
Размер в блоках, если иное не задано явно или через переменные окружения, то блок равен 512 байтам,
см.: https://www.gnu.org/software/coreutils/manual/html_node/Block-size.html

20.07.2017 14:15 #424427

OK. Допустим. Но почему нужно 8 блоков? На что они истрачены файловой системой?

20.07.2017 14:17 #424428

А, кажется, дошло. 8 х 512 = 4К именно столько отводится под каталог.
Добавлено: 20.07.2017 14:17:22

Спасибо, коллеги, теперь ясно.

20.07.2017 17:41 #424431

Неправильно!

text
# ls -al tmp
total 8
drwxr-xr-x.  2 root root 4096 Jun 24  2016 .
dr-xr-x---. 42 root root 4096 Jul 20 16:15 ..

ls поступает, не задумываясь: делит размер каждого выведенного файла на 1024 с избытком и всё складывает.
Кстати, для того же каталога:

text
# ls -l tmp
total 0

Так что всё это условно.

20.07.2017 18:24 · отредактировано #424432

Объяснение, которое кажется мне сейчас наиболее логичным:
1. Элемент каталога занимает 4096 байт данных (о чём и сообщает ls для каждого элемента)
2. 4096 это 8 блоков по 512 байт (512 размер блока по умолчанию)
3. Поэтому для пустого каталога, где есть только элементы "." и ".." размер равен 8 ("total 8")
4. ls учитывает элементы в соответствии со своими опциями. Например, "ls -la /tmp" мне показывает 32 и действительно я вижу 8 элементов каталога, а вот "ls -l /tmp" показывает почему-то 4 (это я пока объяснить не могу)

P.S. Почитал ещё по теме - выше не совсем адекватная трактовка (вернее совсем не адекватная) :) Завтра постараюсь сформулировать правильно.

20.07.2017 22:21 #424437

Вы бы в документацию заглянули. Там там всё толково описано, правда вряд ли по-русски:

Some GNU programs (at least ‘df’, ‘du’, and ‘ls’) display sizes in
“blocks”. You can adjust the block size and method of display to make
sizes easier to read. The block size used for display is independent of
any file system block size. Fractional block counts are rounded up to
the nearest integer
.

В сокращённом переводе: ряд программ показывают размеры в "блоках". Выводимый размер блока не зависит от размера блока файловой системы.

Далее долго описывается как этот размер изменить и что по умолчанию он 1024

Пример:
text
[xbatob@pink ~]$ ls -ls Polygon/
итого 868
  4 drwxrwxr-x. 3 xbatob xbatob   4096 окт  7  2016 192.168.113.219
  4 -rw-r-----. 1 xbatob xbatob     91 мар 16  2015 dns.key
  4 -rwxr-x---. 1 xbatob xbatob   2865 мар 16  2015 dns-update.sh
856 -rw-r-----. 1 xbatob xbatob 869405 июл 16  2015 maint.bin
$ BLOCKSIZE=4096 ls -ls Polygon/
итого 217
  1 drwxrwxr-x. 3 xbatob xbatob   4096 окт  7  2016 192.168.113.219
  1 -rw-r-----. 1 xbatob xbatob     91 мар 16  2015 dns.key
  1 -rwxr-x---. 1 xbatob xbatob   2865 мар 16  2015 dns-update.sh
214 -rw-r-----. 1 xbatob xbatob 869405 июл 16  2015 maint.bin
21.07.2017 07:12 · отредактировано #424439

s.xbatob, похоже, вы правы. Спасибо за разъяснение.

P.S. Единственное, что можно добавить, это то, что размер каталога всё-таки кратен размеру data block файловой системы (как правило 4K), а затем переводится в блоки команды ls.
P.P.S. Ну и то, что мелкие файлы тоже всё-таки кратны data block, что видно из вашего примера, то есть отчасти зависят от его размера.

22.07.2017 15:51 #424465

s.xbatob,

For ls file sizes, the block size defaults to 1 byte.
22.07.2017 17:09 #424466

Тоесть пустой каталог по умолчанию 4 байта получается?

23.07.2017 14:54 #424483
bormant написал:
s.xbatob,

For ls file sizes, the block size defaults to 1 byte.

Я не понял, где можно увидать подтверждение данной фразы.

Предыдущая фраза:

If none of the above environment variables are set, the block size currently defaults to 1024 bytes in most contexts, but this number may change in the future.
, - напротив, хорошо соотносится с реальностью.
24.07.2017 09:11 · отредактировано #424492

В общем, смешались в кучу кони, люди.

1) For ls file sizes, the block size defaults to 1 byte.
Это относится только к размерам файлов, выводимых ls по каждому из этих файлов. Но не относится к выводу итога
total: 8

2) Итог выводится с дефолтным размером блока для coreutils. Получить его в байтах тоже несложно:
[console]$ ls -la --block-size=1
total 8192
...
[/console]

3) опция --block-size влияет и на вывод итогов, и на вывод размеров отдельных файлов, например, см:
[console]$ ls -la --block-size=1024
total 8
... 4 ... ./
... 4 ... ../
[/console]

4) на вывод ls влияет содержимое переменной окружения LS_OPTIONS.

24.07.2017 11:48 #424496
bormant написал:
s.xbatob,

For ls file sizes, the block size defaults to 1 byte.

Прошу ваши собственные измышления мне не приписывать!

Войдите или зарегистрируйтесь, чтобы ответить.