Записки IT специалиста
9.02K subscribers
2.46K photos
37 videos
16 files
2.42K links
IT-канал, просто о сложном
https://interface31.ru

Купить рекламу:
https://telega.in/c/interface31
Download Telegram
Временные метки файлов в Linux

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

Согласно стандарту POSIX у файлов в Linux имеются три временных метки:

▫️ atime – время последнего доступа к файлу
▫️ mtime – время последней модификации содержимого файла
▫️ ctime – время последнего изменения содержимого файла или его метаданных

С первой меткой вроде бы все просто, atime обновляется при любом доступе к файлу, однако по умолчанию в большинстве систем включен режим relatime (метка обновляется не чаще раза в сутки, если файл не менялся), а при опции noatime обновление отключено вовсе

Метка mtime меняется при изменении содержимого файла, но ее не меняют изменения метаданных, такие как изменение владельца или прав доступа или переименование.

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

Особенностью метки ctime является то, что данная метка управляется системой, в то время как atime и mtime может произвольно изменять владелец файла. Таким образом данная метка однозначно покажет нам время последнего изменения файла, в то время как mtime может содержать неверную информацию.

При этом в нормальных условиях изменение mtime всегда влечет изменение ctime, а вот изменение ctime может происходить отдельно от других временных меток.

Так переименование файла изменит только ctime (а также затронет родительский каталог), но не отразится на mtime, а изменение прав или владельца файла затронет только ctime.

Позвольте, скажет иной читатель, а как быть с временем создания файла? А никак, такой временной метки POSIX не предусматривает. Однако позже была добавлена еще одна временная метка – crtime – которая как раз отражает время создания файла, но она имеет некоторые особенности.

Не являясь POSIX-совместимой, данная метка была реализована на уровне файловой системы и, следовательно, хранится только в ее пределах, между системами данный атрибут не переносится.

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

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

Каким образом можно посмотреть временные метки? Используйте команду stat, например:

stat file.txt

Строки Доступ, Модифицирован и Изменен будут соответствовать atime, mtime и ctime. Однако если мы посмотрим на свойства файла в графическом окружении, то сможем увидеть, что Изменен в этом случае соответствует mtime, что в целом верно логически, но способно внести путаницу.

Поэтому, если вы хотите получить точное значение параметра, то используйте форматирование вывода команды stat:

stat -c '%x' file.txt - atime
stat -c '%y' file.txt - mtime
stat -c '%z' file.txt - ctime

Как видим, вроде бы простая тема оказалась не такой уж и простой. Но, если не пытаться переносить на Linux опыт других систем, а внимательно изучить теорию, то все станет на свои места и вы будете прекрасно понимать, что значит та или иная временная метка.
1🤝4👍1