Как получить физический размер файла в Linux?

12

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

user285003
источник
Пожалуйста, определите, что вы подразумеваете под «физическим» размером.
Jörg W Mittag

Ответы:

28

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

По умолчанию duуказывает размер файла в количестве блоков на диске, но вы можете использовать его, -hчтобы получить читабельную единицу. Смотрите также руководство duпо вашей системе.

Обратите внимание, что для GNU coreutil 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- это сколько байтов программа сможет прочитать с него. Если файл является разреженным, некоторые из прочитанных байтов будут нулевыми, но они все равно будут доставлены в программу, которая их читает (только не с диска).
Кусалананда
Это был действительно хороший ответ.
Ящерица
3

Я получаю размер файла в байтах, как это:

actualsize=$(du -b "${file}" | cut -f 1)
Woohoo
источник