Примеры использования утилиты touch в Linux

В операционной системе Linux существует полезная утилита touch, которую по моим наблюдениям чаще всего используют не по её прямому назначению.

Когда-то давно я увидел, что с её помощью можно создать пустой файл. Запомнил это и сам постоянно её использую, хотя есть способы проще. А изначально touch была создана для обновления информации о времени изменения и доступа к файлу. Об этом прямо написано в man этой утилиты: Update the access and modification times of each FILE to the current time.

 

Создание файлов

С помощью touch можно создать пустой файл или несколько файлов сразу:

# touch file01.txt

# touch file01.txt file02.txt file03.txt

# touch file0{1,2,3}.txt

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

# ls -l file01.txt --time=atime

# touch -a file01.txt

# ls -l file01.txt --time=atime

Посмотрели старое время доступа, обновили его до актуального и посмотрели ещё раз. Время будет обновлено.

То же самое для времени изменения файла:

# ls -l file01.txt

# touch -m file01.txt

# ls -l file01.txt

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

Подобный функционал с изменением меток времени можно использовать в скриптах, когда нужно после выполнения какого-то действия явно указать, что изменения произошли, даже если файлы не поменялись. Например, взять какой-то файл за образец того, когда выполнялся последний бэкап и перед его выполнением менять дату доступа к файлу. Отслеживая изменение этого файла можно следить за выполнением процесса синхронизации. Это пример того, как я сам использую подобный функционал. Суть в том, что если файлы в неизменном виде приезжают на бэкап сервер со своими исходными метками доступа и изменения, то в случае если в источнике файлы не изменились за время между бэкапами, на приёмнике трудно понять, а была ли реально выполнена синхронизация. Может файлы не изменились, а может и копирования не было. А если вы какой-то файл на источнике принудительно пометите с помощью touch, то проверив его изменение на приёмнике вы хотя бы будете знать, что синхронизация реально произошла, просто файлы не изменились.

 

Установить дату изменения файла с помощью touch

Также с помощью touch можно явно указать дату изменения файла. Можно его существенно состарить:

# touch -t 201903211655 file01.txt

# ls -l file01.txt

-rw-r--r-- 1 root root 0 Mar 21 2019 file01.txt

 

изменение даты создания файла с помощью touch

 

Установили дату изменения файла — 21 марта 2019 года 16:55. Формат даты в команде — YYMMDDhhmm. Данный приём активно использую всякие зловреды на сайтах, чтобы затеряться среди старых файлов. Обычно когда разбираются во взломе, первым делом ищут все недавно изменённые файлы. А после такого изменения файл может разом состариться на пару лет.

Но если внимательно посмотреть на изменяемый файл с помощью stat, то можно увидеть время его создания и изменения атрибутов (change и birth):

# stat file01.txt

 File: file01.txt

 Size: 0      Blocks: 0     IO Block: 4096  regular empty file

Device: 802h/2050d Inode: 790197   Links: 1

Access: (0644/-rw-r--r--) Uid: (  0/  root)  Gid: (  0/  root)

Access: 2019-03-21 16:55:00.000000000 +0300

Modify: 2019-03-21 16:55:00.000000000 +0300

Change: 2023-01-19 01:09:17.084405177 +0300

 Birth: 2023-01-19 00:50:59.789606107 +0300

Наверное их тоже можно поменять, но я не разбирался с этим. Если кто-то знает, как это сделать, подскажите.