Яка різниця між 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 дасть вам фактичний розмір файлу.

Те, що ви дивитесь, - це різниця між фактичним розміром файлу та кількістю місця на диску, який він займає. (також називається ефективністю файлової системи).

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

Відповіді:


48

Це називається слабким простором :

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

Отже, якщо ваша файлова система виділяє простір в одиницях 64 Кб, а ви зберігаєте файл 3 Кб, то:

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

Примітка . Деякі файлові системи підтримують субалокацію блоку , що допомагає пом'якшити цю проблему шляхом призначення декількох невеликих файлів (або задніх кінців великих файлів) до одного блоку.


1
Це одне прокляте гарне пояснення.
SpacemanSpiff

1
@ Handyman5 - Дякую Handyman5. Отже, коли я дивлюся на розмір файлу чи папки за допомогою ls, він повертає фактичний розмір, а du повертає розмір резидента? Це правильно? Тож якщо дивитися на розмір файлу, який є найбільш точним, тобто розміром резидента чи розміром файлу, чи це довільне запитання?
PeanutsMonkey

8
@PeanutsMonkey, точність в очах глядача. ;-) В основному, якщо ви стурбовані тим, скільки місця займає файл десь в іншому місці (наприклад, копіювання по мережі, додавання до zip-файлу, резервне копіювання на зовнішній диск тощо), то фактичний розмір - це те, що тебе хвилює. Якщо вас турбує кількість місця, яке залишилося на диску, де зараз знаходиться файл, то ви дбаєте про розмір резидента. Оскільки duпоказує вам мудрець disk u, він дивиться на простір, зайнятий на поточному диску, і, таким чином, він показує вам розмір резидента.
Різноробочий5

1
@ Handyman5 - Це майже рік після публікації, але мені цікаво, як відрізняється відповідь вище при використанні df -h?
PeanutsMonkey

1
dfповідомляє кількість залишених блоків * розмір блоку файлової системи. У цьому випадку було б більше схоже du, оскільки навіть частково використані блоки вважаються повністю виділеними. dfв основному перекладає statvfs , щоб ви могли подивитися на цей системний виклик, щоб краще зрозуміти, що відбувається.
Handyman5

19

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

Весела хитрість: Створіть велику кількість великих розріджених файлів, а потім вражте своїх друзів тим, скільки у вас є дискового простору ("дивіться, я зберігаю на моєму жорсткому диску одинадцять газильйонів файлів 1 ТБ!") Гаразд, можливо, не так весело тоді.


6

Файлові системи складаються з блоків. Файли не повинні акуратно вписуватися в блоки. Якби файл був 1024 байтом, його розмір у ls, а du буде 1024. Якщо розмір файлу становив 1025, розмір становив би 1025 ins та 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 знає, коли він бачить той самий файл під іншим іменем (жорсткі посилання, на відміну від символьних посилань) і повідомить про кожен файл за розміром, який він є, але лише додасть розмір один раз до загальної батьківської директорії.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.