Сравнение атрибутов файла
Один из методов поиска модифицированных файлов, позволяющих избежать копирования файлов, основан на использовании их атрибутов. К атрибутам файла относятся дата, время создания и модификации файла и разрешения работы с ним. Некоторые из них могут оказаться полезными для определения только что измененных файлов.
Ниже представлен уместный фрагмент кода файла ext2_fs.h инсталляции Red Hat 6.2 Linux:
>/*
>* Structure of an inode on the disk
>*/
>struct ext2_inode {
>__u16 i_mode; /* File mode */
>__u16 i_uid; /* Owner Uid */
>__u32 i_size; /* Size in bytes */
>__u32 i_atime; /* Access time */
>__u32 i_ctime; /* Creation time */
>__u32 i_mtime; /* Modification time */
>__u32 i_dtime; /* Deletion Time */
>__u16 i_gid; /* Group Id */
>__u16 i_links_count; /* Links count */
>__u32 i_blocks; /* Blocks count */
>__u32 i_flags; /* File flags */
В большинстве UNIX-систем атрибуты файла описаны похожим способом. В их состав входят владелец, размер, несколько полей времени и даты, группа, счетчик связей этого файла, число используемых блоков диска и флаги файла (стандартные разрешения чтения, записи и выполнения файлов).
Какие атрибуты интересны для нас? В большинстве случаев это один из атрибутов времени и размер файла. Любой из них может быть определен переадресовыванием вывода команды ls – al в файл до и после наступления анализируемого события с последующим сравнением двух файлов, как это показано в следующем примере:
>[elliptic@ellipse]$ diff /tmp/before /tmp/after
>2,3c2,3
>< drwxrwxr-x 2 ryan ryan 7168 Jun 16 01:55 .
>< drwxrwxrwt 9 root root 1024 Jun 16 01:55 ..
>–
>> drwxrwxr-x 2 ryan ryan 7168 Jun 16 01:56 .
>> drwxrwxrwt 9 root root 1024 Jun 16 01:56 ..
>97c97
>< -rw-r—r– 1 ryan ryan 31533 Jun 16 01:55 fs.h
>–
>> -rw-r—r– 1 ryan ryan 31541 Jun 16 01:56 fs.h
Из примера видно, что файл fs.h изменился. Этот способ сравнения содержимого директории обнаруживает изменение любого атрибута файла. Быстрый способ простого отслеживания изменения атрибута времени заключается в использовании команды ls – al, показанной в следующем примере. Команда ls – al в примере соединена программным каналом с командой more:
>[elliptic@ellipse]$ ls -alt | more
>total 2224
>drwxrwxrwt 9 root root 1024 Jun 16 01:56 ..
>drwxrwxr-x 2 ryan ryan 7168 Jun 16 01:56 .
>-rw-r—r– 1 ryan ryan 31541 Jun 16 01:56 fs.h