Понимание временных меток файлов Linux: mtime, ctime и atime

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

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

Что такое три метки времени Unix?

С каждым файлом связаны три отметки времени. Linux хранит их в формате времени Unix, который измеряет секунды с начала эпохи. Эти три отметки времени обычно называются atime, ctime и mtime.

Mtime – самый распространенный и часто самый полезный. Это означает модифицированное время . Это время последней записи содержимого файла на диск.

Немного отличается ctime, обозначающий время изменения . Эта временная метка отслеживает изменения метаданных, такие как права собственности и разрешения. Он включает в себя переименование файла – по крайней мере, в типичных современных ОС Linux. Но он также обновляется при изменении содержимого файла, поэтому он всегда актуален, как и mtime.

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

Как метки времени применяются к каталогам

Каталог Linux – это, по сути, список файлов в этом каталоге. Таким образом, создание файла внутри каталога обновит mtime этого каталога. Список файлов в каталоге, например, с помощью команды ls , обновляет время доступа. И, как и в случае с файлом, изменение разрешений или имени каталога обновляет его ctime.

А как насчет времени создания?

Вы можете удивиться, узнав, что Linux просто не отслеживает время создания. Сначала вы можете предположить, что ctime означает время создания. Точно так же вы можете подумать об этом как о очень полезной вещи, которую нужно выяснить.

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

Как просмотреть разные отметки времени

Самый простой способ получить информацию о метке времени – использовать команду ls . Длинный формат по умолчанию показывает детали для mtime:

 $ date
Sat Mar 6 16:57:01 GMT 2021
$ echo "hello, world" > tmp
$ ls -l tmp.txt
-rw-r--r-- 1 ubuntu ubuntu 13 2021-03-06 16:57 tmp

Вместо этого вы можете отобразить atime, используя флаг -u :

 $ date
Sat Mar 6 16:59:33 GMT 2021
$ cat tmp
hello, world
$ ls -lu tmp
-rw-r--r-- 1 ubuntu ubuntu 13 2021-03-06 16:59 tmp
$ ls -l tmp
-rw-r--r-- 1 ubuntu ubuntu 13 2021-03-06 16:57 tmp

Последняя строка подтверждает, что mtime этого файла отличается от atime. Наконец, используйте флаг -c для просмотра ctime:

 $ date
Sat Mar 6 17:02:34 GMT 2021
$ mv tmp tmp2
$ ls -lc tmp2
-rw-r--r-- 1 ubuntu ubuntu 13 2021-03-06 17:02 tmp2
$ ls -l tmp2
-rw-r--r-- 1 ubuntu ubuntu 13 2021-03-06 16:57 tmp2
$ ls -lu tmp2
-rw-r--r-- 1 ubuntu ubuntu 13 2021-03-06 16:59 tmp2

На этот раз мы подтверждаем, что все три раза разные и правильные: мы изменили, затем открыли, а затем изменили файл в указанном порядке.

Альтернативой ls является команда stat . Эта команда отображает низкоуровневую информацию из индексного дескриптора файла. Это упрощает проверку всех трех раз сразу. Это также решает проблему неинтуитивного флага -u . Вот пример вывода для того же файла:

 $ stat tmp2
File: `tmp2'
Size: 13 Blocks: 8 IO Block: 4096 regular file
Device: 801h/2049d Inode: 327688 Links: 1
Access: (0644/-rw-r--r--) Uid: ( 1000/ ubuntu) Gid: ( 1000/ ubuntu)
Access: 2021-03-06 16:59:45.000000000 +0000
Modify: 2021-03-06 16:57:59.000000000 +0000
Change: 2021-03-06 17:02:43.000000000 +0000

Как обновить отметки времени

Сенсорная команда изменяет время модификации и доступа к файлу. Это также удобный способ создания пустого файла, который он сделает, если файл еще не существует:

 touch tmp

По умолчанию он устанавливает mtime и atime на текущее время. Вы можете установить другое время с помощью флага -t :

 touch -t 202103061200 tmp

Вы также можете установить только mtime или atime с помощью флагов -m и -a соответственно:

 touch -t 202103061300 -m tmp

Обратите внимание, что ctime всегда обновляется, когда мы устанавливаем atime или mtime.

Как найти файлы по отметкам времени

Команда find – это еще один инструмент, который работает с отметками времени. Он может фильтровать файлы по времени atime, ctime или mtime. Например:

 find . -amin 15

найдет файлы, к которым обращались ровно 15 минут назад, при этом:

 find . -mtime -2

найдет файлы, измененные за последние два дня.

Linux отслеживает каждый файл трижды

Метка времени файла, на которую чаще всего ссылаются, – это mtime. Например, это дата и время, которые отображаются в списке файлов. Но две другие отметки времени также могут быть полезны, если вы понимаете, о чем они говорят. В частности, всегда помните, что ctime представляет время изменения , а не время создания .

Такие команды, как touch и stat, являются полезными членами набора инструментов командной строки Linux. Эти команды улучшат ваш рабочий процесс Linux, позволяя быстро создавать новые файлы.