Получение информации о файлах при помощи stat






В предыдущей статье мы с вами знакомились с термином 'inode' и о роли индексных дескрипторов в жизни файловой системы. Однако мы не рассмотрели того, как получить подробную информацию о том, сколько всего inode доступно в файловой системе, а также сколько свободных осталось. Это и многое другое можно узнать при помощи утилиты stat.



Утилита stat является частью GNU Coreutils, а значит должна быть доступна в любом современном Linux-дистрибутиве. Задачей stat является вывод информации об одном или более файлов, а также о файловых системах. При помощи утилиты вы сможете узнать, например, сколько блоков диска выделено для хранения файла, сколько индексных дескрипторов доступно на той или иной ФС, а также многое другое. Основным преимуществом stat является то, что вы можете получать информацию в любом удобном для вас виде, что даёт возможность очень легко получать нужные данные и манипулировать ими в сценариях оболочки.

В общем случае формат вызова stat таков:

stat [опция]... [путь]...

Давайте, например, посмотрим на вывод информации о /etc/passwd:

$ stat /etc/passwd
 File: `/etc/passwd'
 Size: 2154          Blocks: 8          IO Block: 4096   regular file
Device: 802h/2050d    Inode: 786548      Links: 1
Access: (0644/-rw-r--r--)  Uid: (    0/    root)   Gid: (    0/    root)
Access: 2011-06-20 19:00:01.606463000 +0300
Modify: 2011-05-24 20:39:21.836670002 +0300
Change: 2011-05-24 20:39:21.860670002 +0300

Из полученного вывода можно определить следующее:

  • файл имеет размер 2154 байта, занимает восемь 512-байтных блоков ;
  • размер блока ФС, на которой расположен файл, при операциях ввода/вывода составляет 4 килобайта;
  • идентификатор устройства, на котором расположен файл: 802h (шестнадцатеричный) или 2050d (десятичный);
  • номер индексного дескриптора файла — 786548;
  • файл не имеет жёстких ссылок (одна ссылка в отчёте stat — и есть сам файл);
  • режим доступа к файлу: 0644;
  • владелец файла — root, группа-владелец — root;
  • время последнего доступа к файлу: 2011-06-20 19:00:01;
  • время последнего изменения файла: 2011-05-24 20:39:21;
  • время последнего изменения индексного дескриптора файла: 2011-05-24 20:39:21;

Как уже говорилось, вы можете явно определять, какую информацию нужно выводить, а какую нет. Для этих целей в программе предусмотрена опция '--printf', после которой необходимо указать нужный вам формат вывода. Например, следующая команда выведет, разделив знаком табуляции: имя файла, его размер в байтах, размер в блоках, номер его inode и тип файла с точки зрения ОС. Вывод будет завершён символом новой строки:

$ stat --printf '%n\t%s\t%b\t%i\t%F\n' /etc/passwd
/etc/passwd    2154    8    786548    regular file

Подобным образом вы можете выводить информацию сразу о нескольких файлах, перечислив пути к ним в качестве аргументов:

$ stat --printf '%n\t%s\t%b\t%i\t%F\n' /etc/passwd /dev/dvd /dev/sg0
/etc/passwd    2154    8    786548    regular file
/dev/dvd       3       0    6997      symbolic link
/dev/sg0       0       0    5519      character special file

или же, естественно, вы можете использовать wildcards оболочки:

$ stat --printf '%n\t%s\t%b\t%i\t%F\n' /tmp/*
/tmp/gnucash.trace         0       0    392110    regular empty file
/tmp/hsperfdata_ashep      4096    8    392064    directory
/tmp/keyring-XJ5URh        4096    8    392007    directory
/tmp/mc-ashep              4096    8    413063    directory
/tmp/orbit-ashep           4096    8    391967    directory
/tmp/orbit-gdm             4096    8    391960    directory
/tmp/plugtmp               4096    8    412871    directory
/tmp/pulse-rwNQrxNhZvCt    4096    8    392060    directory
/tmp/ssh-PYSARO7941        4096    8    391958    directory
/tmp/virtual-ashep.ENf1ty  4096    8    392104    directory

Подробную информацию обо всех возможных параметрах, которые можно перечислять в опции '--format' можно получить на странице руководства утилиты.

stat может быть использована также для получения информации о файловых системах. Для этого программе нужно передать опцию '-f':

$ stat -f /
 File: "/"
 ID: 5d2e58a2f8a69ac2 Namelen: 255     Type: ext2/ext3
Block size: 4096       Fundamental block size: 4096
Blocks: Total: 3844964    Free: 1684537    Available: 1489222
Inodes: Total: 977280     Free: 510081

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

  • идентификатор файловой системы: 5d2e58a2f8a69ac2;
  • максимальная длина имени файла: 255 символов;
  • тип ФС: ext2/ext3;
  • размер блока: 4 килобайта;
  • общее количество блоков: 3844964, свободных: 1684534, доступных не суперпользователю: 1489222;
  • общее количество индексных дескрипторов: 977280, свободных: 510081.

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

$ stat --printf '%i\t%d\t%b\n' -f /
5d2e58a2f8a69ac2    510081    3844964