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

31

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

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

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

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

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

PeanutsMonkey
источник

Ответы:

48

Это называется слабым местом :

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

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

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

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

Handyman5
источник
1
Это чертовски хорошее объяснение.
SpacemanSpiff
1
@ Handyman5 - Спасибо, Handyman5. Поэтому, когда я смотрю на размер файла или папки, используя ls, он возвращает фактический размер, тогда как du возвращает размер резидента? Это верно? Итак, если посмотреть на размер файла, какой из них является наиболее точным, то есть размер резидента или размер файла, или это произвольный вопрос?
PeanutsMonkey
8
@PeanutsMonkey, точность в глазах смотрящего. ;-) В основном, если вас беспокоит, сколько места займет файл где-то еще (например, копирование по сети, добавление в zip-файл, резервное копирование на внешний диск и т. Д.), Тогда фактический размер - это то, что Вы заботитесь о. Если вас беспокоит объем места, оставшегося на диске, где сейчас находится файл, то вам важен размер резидента. Так duкак он показывает вам disk usage, он смотрит на пространство, занимаемое текущим диском, и, таким образом, показывает размер резидента.
Handyman5
1
@ Handyman5 - Прошел почти год после публикации, но мне любопытно, чем отличается ответ выше при использовании df -h?
PeanutsMonkey
1
dfсообщает количество оставшихся блоков * размер блока файловой системы. В этом случае это было бы больше похоже на то du, что даже частично используемые блоки считаются полностью выделенными. dfв основном переводит statvfs , так что вы можете взглянуть на этот системный вызов, чтобы лучше понять, что происходит.
Разнорабочий5
19

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

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

romble
источник
6

Файловые системы состоят из блоков. Файлы не должны аккуратно вписываться в блоки. Если файл имеет размер 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
иан
источник
0

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

Клиффорд Хит
источник