Назад | Перейти на главную страницу

В чем разница между du -h и ls -lh?

Мне трудно понять, как правильно читать размер файлов, поскольку каждая команда дает разные результаты. Я также наткнулся на сообщение на http://forums.devshed.com/linux-help-33/du-and-ls-generating-inconsistent-file-sizes-42169.html в котором говорится следующее;

du дает вам размер файла, который находится в файловой системе. (IE всегда будет давать результат, кратный 1024).

ls предоставит вам фактический размер файла.

Вы видите разницу между фактическим размером файла и объемом места на диске, которое он занимает. (также называется эффективностью файловой системы).

В чем разница между тем, как он находится в файловой системе, и фактическим размером файла?

Это называется свободное пространство:

Каждый уровень абстракции поверх отдельных битов и байтов приводит к потере пространства, когда файл данных меньше наименьшей единицы данных, которую файловая система способна отслеживать. Это потраченное впустую пространство в секторе, кластере или блоке обычно называется резервным пространством и обычно не может использоваться для хранения дополнительных данных. Для отдельных 256-байтовых секторов максимальный объем неиспользуемого пространства составляет 255 байтов. Для кластеров размером 64 килобайта максимальное неиспользованное пространство составляет 65 535 байт.

Итак, если ваша файловая система выделяет пространство блоками по 64 КБ, и вы храните файл размером 3 КБ, то:

  • файлы фактический размер составляет 3 КБ.
  • файлы размер резидента составляет 64 КБ, так как оставшиеся 61 КБ в этом блоке не могут быть выделены другому файлу и, таким образом, потеряны.

Заметка: Некоторые файловые системы поддерживают перераспределение блоков, который помогает смягчить эту проблему, назначая несколько небольших файлов (или конечных частей больших файлов) в один блок.

Здесь есть еще один вариант, который не рассматривался - разреженные файлы. В таком случае, du покажет меньший размер, чем простой ls -l будет, потому что ls сообщает "размер" файла как очевидный size (количество байтов, которое вы можете прочитать, если вам нужно много нулей), а du продолжит использовать фактическое количество используемых дисковых блоков.

Забавный трюк: создайте очень много больших разреженных файлов, а затем поразите своих друзей, сколько у вас дискового пространства («смотрите, я храню на своем жестком диске одиннадцать миллионов файлов размером 1 ТБ!»). Ладно, может, тогда не так весело.

Файловые системы состоят из блоков. Файлы не должны аккуратно умещаться в блоки. Если размер файла 1024 байта, его размер будет в ls, а du будет 1024. Если размер файла будет 1025, размер будет 1025 в ls и 2048 в du.

Обратите внимание, что в приведенном выше примере предполагается, что размер блока составляет 1024. В наши дни большие размеры блоков являются нормой. E, g,

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

du -h fred
8.0K    fred

Есть еще одна причина, по которой они могут отличаться. du -h знает, когда он видит тот же файл под другим именем (жесткие ссылки, в отличие от символических ссылок), и сообщает каждый файл о его размере, но только один раз добавляет размер в общий родительский каталог.