Поиск по сайту:

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


Когда вы используете команду Linux du, вы получаете как фактическое использование диска, так и истинный размер файла или каталога. Мы объясним, почему эти значения не совпадают.

Фактическое использование диска и истинный размер

Размер файла и место, которое он занимает на жестком диске, редко совпадают. Дисковое пространство распределяется блоками. Если файл меньше блока, ему все равно выделяется целый блок, потому что файловая система не может использовать меньшую единицу недвижимости.

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

Два измерения используются в отношении размера файла. Во-первых, это фактический размер файла, то есть количество байтов содержимого, составляющих файл. Во-вторых, эффективный размер файла на жестком диске. Это количество блоков файловой системы, необходимое для хранения этого файла.

Пример

Давайте рассмотрим простой пример. Мы перенаправим один символ в файл, чтобы создать небольшой файл:

echo "1" > geek.txt

Теперь мы будем использовать список в длинном формате, ls, чтобы посмотреть длину файла:

ls -l geek.txt

Длина – это числовое значение, которое следует за записями dave dave   и составляет два байта. Почему это два байта, когда мы отправили в файл только один символ? Давайте посмотрим, что происходит внутри файла.

Мы будем использовать команду hexdump, которая даст нам точное количество байтов и позволит нам «видеть» непечатаемые символы как шестнадцатеричные значения. Мы также будем использовать параметр -C (канонический), чтобы заставить вывод отображать шестнадцатеричные значения в теле вывода, а также их эквиваленты буквенно-цифровых символов:

hexdump -C geek.txt

Вывод показывает нам, что начиная со смещения 00000000 в файле есть байт, содержащий шестнадцатеричное значение 31, и байт, содержащий шестнадцатеричное значение 0A. В правой части выходных данных эти значения отображаются как буквенно-цифровые символы, где это возможно.

Шестнадцатеричное значение 31 используется для представления цифры один. Шестнадцатеричное значение 0A используется для представления символа перевода строки, который не может отображаться как буквенно-цифровой символ, поэтому вместо этого он отображается в виде точки (.). Символ перевода строки добавляется с помощью echo . По умолчанию echo начинает новую строку после отображения текста, который необходимо записать в окно терминала.

Это соответствует выходным данным ls и соответствует длине файла в два байта.

Теперь воспользуемся командой du, чтобы посмотреть размер файла:

du geek.txt

Там написано, что размер четыре, но четыре чего?

Есть блоки, а есть блоки

Когда du сообщает о размерах файлов в блоках, используемый размер зависит от нескольких факторов. Вы можете указать, какой размер блока он должен использовать в командной строке. Если вы не заставите du использовать определенный размер блока, он следует набору правил, чтобы решить, какой из них использовать.

Сначала он проверяет следующие переменные среды:

  • DU_BLOCK_SIZE
  • BLOCK_SIZE
  • РАЗМЕР

Если какой-либо из них существует, размер блока устанавливается, и du прекращает проверку. Если ничего не задано, для du по умолчанию используется размер блока 1024 байта. Если только не установлена переменная среды с именем POSIXLY_CORRECT. В этом случае размер блока du по умолчанию составляет 512 байт.

Итак, как мы узнаем, какой из них используется? Вы можете проверить каждую переменную среды, чтобы разобраться, но есть более быстрый способ. Давайте сравним результаты с размером блока, который использует файловая система.

Чтобы определить размер блока, который использует файловая система, мы воспользуемся программой tune2fs. Затем мы воспользуемся параметром -l (list superblock), направим вывод через grep, а затем напечатаем строки, содержащие слово «Block».

В этом примере мы рассмотрим файловую систему на первом разделе первого жесткого диска, sda1, и нам нужно будет использовать sudo:

sudo tune2fs -l /dev/sda1 | grep Block

Размер блока файловой системы составляет 4096 байт. Если мы разделим это на результат, полученный от du (четыре), получится, что размер блока du по умолчанию – 1024 байта. Теперь мы знаем несколько важных вещей.

Во-первых, мы знаем, что наименьший объем файловой системы, который можно выделить для хранения файла, составляет 4096 байт. Это означает, что даже наш крошечный двухбайтовый файл занимает 4 КБ на жестком диске.

Во-вторых, следует помнить о приложениях, предназначенных для создания отчетов о статистике жесткого диска и файловой системы, таких как du, ls и tune2fs. могут иметь разные представления о том, что означает «блок». Приложение tune2fs сообщает истинные размеры блоков файловой системы, в то время как ls и du можно настроить или принудительно использовать блоки других размеров. Эти размеры блоков не предназначены для связи с размером блока файловой системы; это просто «фрагменты», которые эти команды используют в своем выводе.

Наконец, помимо использования разных размеров блоков, ответы от du и tune2fs передают одинаковое значение. Результат tune2fs — один блок по 4096 байт, а результат du — четыре блока по 1024 байта.

Использование дю

Без параметров или опций командной строки du показывает общее дисковое пространство, используемое текущим каталогом и всеми его подкаталогами.

Давайте посмотрим на пример:

du

Размер сообщается в размере блока по умолчанию 1024 байта на блок. Просматривается все дерево подкаталогов.

Использование du в другом каталоге

Если вы хотите, чтобы du выдавал отчет о другом каталоге, отличном от текущего, вы можете указать путь к каталогу в командной строке:

du ~/.cach/evolution/

Использование du для определенного файла

Если вы хотите, чтобы du отправлял отчет по определенному файлу, укажите путь к этому файлу в командной строке. Вы также можете передать шаблон оболочки в выбранную группу файлов, например *.txt:

du ~/.bash_aliases

Отчеты о файлах в каталогах

Чтобы du сообщал о файлах в текущем каталоге и подкаталогах, используйте параметр -a (все файлы):

du -a

Для каждого каталога сообщается размер каждого файла, а также общий размер для каждого каталога.

Ограничение глубины дерева каталогов

Вы можете указать du, чтобы он отображал дерево каталогов до определенной глубины. Для этого используйте параметр -d (максимальная глубина) и укажите значение глубины в качестве параметра. Обратите внимание, что все подкаталоги сканируются и используются для расчета сообщаемых итогов, но не все они перечислены. Чтобы установить максимальную глубину каталога в один уровень, используйте эту команду:

du -d 1

В выходных данных указан общий размер этого подкаталога в текущем каталоге, а также общий размер для каждого из них.

Чтобы перечислить каталоги на один уровень глубже, используйте эту команду:

du -d 2

Установка размера блока

Вы можете использовать параметр block, чтобы установить размер блока для du для текущей операции. Чтобы использовать размер блока в один байт, используйте следующую команду, чтобы получить точные размеры каталогов и файлов:

du --block=1

Если вы хотите использовать размер блока в один мегабайт, вы можете использовать опцию -m (мегабайт), которая аналогична --block=1M:

du -m

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

du -h

Чтобы увидеть видимый размер файла, а не объем места на жестком диске, используемом для хранения файла, используйте параметр --apparent-size:

du --apparent-size

Вы можете комбинировать это с опцией -a (все), чтобы увидеть видимый размер каждого файла:

du --apparent-size -a

Каждый файл указан вместе с его видимым размером.

Отображение только итогов

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

du -h -s

Здесь мы будем использовать его с опцией --apparent-size:

du --apparent-size -s

Отображение времени модификации

Чтобы увидеть время и дату создания или последнего изменения, используйте параметр --time:

du --time -d 2

Странные результаты?

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

Если вам нужно сопоставить вывод других команд, поэкспериментируйте с параметром --block в du.

RELATED: Best Linux Laptops for Developers and Enthusiasts