2015-07-17 3 views
1

Я сравниваю значение округленного размера файла, отображаемое ls -lh, до необработанного размера в байтах (как показано, например, ls -l). Мне сложно определить, какой алгоритм он использует для преобразования из байтов.Как размер файла `ls -lh`?

Мое предположение, что он интерпретирует единицы K, M, G либо как

  • (а) 10^3, 10^6, 10^9, или
  • (б) 1024, 1024^2, 1024^3.

С одной стороны, у меня есть один файл, который ls -l отчеты как 2052 байт, и ls -lh раундов до 2.1K:

$ ls -l usercount.c 
-rw-r--r-- 1 ssanjabi lsf 2052 May 13 15:41 usercount.c 
$ ls -lh usercount.c 
-rw-r--r-- 1 ssanjabi lsf 2.1K May 13 15:41 usercount.c 

Это, казалось бы поддержать гипотезу (а), так 2052/1000 = 2.052, который округляется до 2.1K, но 2052/1024 = 2.0039, который будет отображаться как 2.0K при округлении до одного десятичного знака.

С другой стороны, у меня есть еще один файл, который ls -l отчеты как 7223 байт, что ls -lh показывает, как 7.1K:

$ ls -l traverse.readdir_r.c 
-rw-r--r-- 1 ssanjabi lsf 7223 Jul 21 2014 traverse.readdir_r.c 
$ ls -lh traverse.readdir_r.c 
-rw-r--r-- 1 ssanjabi lsf 7.1K Jul 21 2014 traverse.readdir_r.c 

Это поддерживает hypthesis смешения (б), так как 7223/1000 = 7.223, который должен округлить до 7,2 К, но 7223/1024 = 7,0537, который округляется до отображаемого 7.1K

Это приводит меня к выводу, что мое предположение неверно и что оно не выполняет ни (a), ни (b) исключительно. Какой алгоритм использует ls, чтобы сделать это округление?

+0

Интересно, что файл 1999 и 2099 годов показал как 2.0K – Kevin

+4

Попробуйте найти источник – Kevin

ответ

2

GNU ls будет по умолчанию округлить до в -у единиц.

Он не округляется до ближайшего, как вы считаете само собой разумеющимся.

Вот флаг форматирования из gnulib human.h:

/* Round to plus infinity (default). */ 
human_ceiling = 0, 

Это согласуется со всем, что вы видите:

  • 2052 является 2,0039 KiB, который округляется до 2,1
  • 7223 является 7,0537 KiB которые округляются до 7.1
+0

Прохладный, спасибо! Я на самом деле немного смущен, что не приходило мне в голову ... – Squirrel

1

по умолчанию размер блока в латах составляет 1024, но, например, если выход 44.203125k будет округлить до 45K
вы можете изменить его слишком

ls -lh --block-size=1000 

и исходный код: ls source code

+1

Спасибо за ваш ответ. Я не думаю, что размер блока действительно влияет на то, как он решает округлить числа. Скорее, он просто сообщает, чтобы дать вам наименьшее количество блоков байтов заданного размера, которые будут содержать файл. – Squirrel