Иногда при работе в командной строке Linux может возникнуть необходимость создать новый файл. Или же может потребоваться изменить временные метки файла. Существует утилита, которую можно использовать в обоих этих случаях. Речь идет о команде touch, и в этом руководстве мы рассмотрим его основные функции на понятных примерах.
Обратите внимание, что все примеры, которые мы будем использовать здесь, протестированы на компьютере с Ubuntu 22.04.
Команда touch в Linux
Команда touch в первую очередь используется для изменения временных меток файлов, но если файл (имя которого передается в качестве аргумента) не существует, то утилита создает его.
Ниже приведен общий синтаксис команды:
touch [OPTION]... FILE...
А вот как эта команда объясняется в справочной странице man:
DESCRIPTION Update the access and modification times of each FILE to the current time. A FILE argument that does not exist is created empty, unless -c or -h is supplied. A FILE argument string of - is handled specially and causes touch to change the times of the file associated with standard output.
Следующие примеры в формате «вопрос-ответ» помогут вам лучше понять, как работает эта утилита.
1. Как изменить время доступа/изменения с помощью команды touch
Это просто и довольно понятно. Возьмем в качестве примера существующий файл. На следующем скриншоте показаны время доступа и время изменения для файла с именем «apl.c».

Вот как можно использовать команду touch для изменения времени доступа и изменения файла:
touch apl.c
На следующем скриншоте подтверждается изменение этих временных меток.

2. Как изменить только время доступа или время изменения
По умолчанию команда touch изменяет как время доступа, так и время изменения входного файла. Однако при желании вы можете ограничить это поведение любой из этих временных меток. Это означает, что вы можете изменить либо время доступа, либо временную метку изменения.
Если вы хотите изменить только время доступа, используйте опцию командной строки -a.
touch -a [filename]
Аналогично, если требуется изменить только время изменения, используйте опцию командной строки -m.
touch -m [filename]
3. Как заставить команду touch использовать время доступа/изменения существующего файла
При желании вы также можете заставить команду touch скопировать временные метки доступа и изменения из файла-эталона. Например, предположим, что мы хотим изменить временные метки для файла ‘apl.c’. Вот текущие временные метки для этого файла:

А вот файл, который вы хотите, чтобы touch использовал в качестве эталона:

Теперь, чтобы touch использовал временные метки файла «apl» для файла «apl.c», вам нужно использовать опцию командной строки -r следующим образом:
touch apl.c -r apl

На приведенном выше снимке экрана видно, что временные метки изменения и доступа для файла «apl.c» теперь совпадают с временными метками файла «apl».
4. Как создать новый файл с помощью команды touch
Создать новый файл также очень просто. Фактически, это происходит автоматически, если имя файла, которое вы передаете в качестве аргумента команде touch, не существует. Например, чтобы создать файл с именем «newfile», вам достаточно выполнить следующую команду touch:
touch newfile
5. Как заставить touch не создавать никаких новых файлов
Если существует строгое требование, чтобы команда touch не создавала никаких новых файлов, можно использовать опцию -c.
touch -c [filename]
На следующем скриншоте видно, что, поскольку файл «newfile12» не существовал, а мы использовали опцию командной строки -c, команда touch не создала файл.

6. Как работает touch в случае символических ссылок
По умолчанию, если вы передаете имя файла символической ссылки команде touch, изменение временных меток доступа и модификации будет касаться исходного файла (того, на который указывает символическая ссылка). Однако утилита также предлагает опцию (-h), которая позволяет переопределить это поведение.
Вот как страница man объясняет опцию -h:
-h, --no-dereference affect each symbolic link instead of any referenced file (useful only on systems that can change the timestamps of a symlink)
Таким образом, если вы хотите изменить метки времени изменения и доступа для символической ссылки (а не для исходного файла), используйте команду touch следующим образом:
touch -h [sym link file name]