Як отримати фізичний розмір файлу в Linux?


12

Я можу використовувати ls -lлогічний розмір файлу, але чи є спосіб отримати фізичний розмір файлу?


Будь ласка, визначте, що ви маєте на увазі під "фізичним" розміром.
Йорг W Міттаг

Відповіді:


28

ls -lдасть вам очевидний розмір файлу, який кількість байтів прочитала б програма, якби вона прочитала файл від початку до кінця. duдав би вам розмір файлу "на диску".

За замовчуванням duнадає розмір файлу в кількості блоків дисків, але ви можете використовувати його, -hщоб замість цього отримати одиницю, прочитану людиною. Дивіться також посібник duіз вашої системи.

Зауважте, що для coreutil GNU du(що, мабуть, є у вас в Linux), -bотримання байтів передбачає --apparent-sizeможливість. Це не те, що ви хочете використовувати, щоб отримати кількість байтів, фактично використаних на диску. Натомість використовуйте --block-size=1або -B 1.

З GNU lsви також можете це зробити ls -s --block-size=1у файлі. Це дасть те саме число, що і du -B 1для файлу.


Приклад:

$ ls -l file
-rw-r--r--  1 myself wheel  536870912 Apr  8 11:44 file

$ ls -lh file
-rw-r--r--  1 myself wheel   512M Apr  8 11:44 file

$ du -h file
24K    file

$ du -B 1 file
24576   file

$ ls -s --block-size=1 file
24576 file

Це означає, що це 512 Мб файл, який займає близько 24 КБ на диску. Це розріджений файл (переважно нулі, які насправді не записуються на диск, але представлені як логічні "дірки" у файлі). Рідкі файли поширені під час роботи з попередньо виділеними великими файлами, наприклад, зображеннями дисків для віртуальних машин або заміною файлів і т.д.

Дивіться також посібник fallocateз вашої системи Linux.


в такому випадку важлива ця різниця? ви можете зробити практичний приклад? наперед дякую.
Д'Арсі Надер

1
@ D'ArcyNader Дивіться оновлену відповідь.
Кусалаланда

Виправте мене, якщо я щось неправильно зрозумію, але, схоже, перше речення - це навпаки: stackoverflow.com/a/31437673/3701431 du показало б, скільки даних можна насправді прочитати, а lsпокаже, наскільки розподілені дискові сектори.
Сергій Колодяжний

2
@SergiyKolodyazhnyy (вибачте за відповідь пізно) Ні, duпоказує кількість диска, який фактично використовується файлом, тоді як очевидний розмір (логічний розмір), який відображається, ls- скільки байтів програма змогла б прочитати з нього. Якщо файл розріджений, частина байтів для читання буде нульовою, але вони все одно будуть доставлені програмі, яка їх читає (тільки не з диска).
Kusalananda

Це була справді гарна відповідь.
Ящірка

3

Я отримую розмір файлу в таких байтах:

actualsize=$(du -b "${file}" | cut -f 1)
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.