Два назначения одной короткой команды
Название touch переводится как «коснуться», и это хорошо описывает суть: команда лишь касается файла. Если файла с таким именем нет, она создаёт его пустым. Если файл существует, его содержимое остаётся прежним, а время последнего изменения и последнего доступа становится равным текущему моменту.
Отсюда два привычных сценария. Первый — быстро создать заготовку: touch notes.txt, touch config.ini. Второй — «встряхнуть» файл, чтобы другие программы решили, что он обновился: например, система сборки или скрипт, ориентирующиеся на время изменения.
Можно передать несколько имён сразу: touch a.txt b.txt c.txt. В bash и zsh удобна фигурная подстановка: touch part{1..3}.txt создаст part1.txt, part2.txt и part3.txt. Эта запись раскрывается самой оболочкой, а не командой touch, поэтому в более простых оболочках она может не работать.
Для тренировки используйте отдельную папку: mkdir ~/touch-test и cd ~/touch-test. Проверять результат удобно через ls -l, который показывает время изменения, и через stat, подробнее о нём рассказано на отдельной странице.
Ключи touch: что меняют
Базовые ключи описаны в справке POSIX, поэтому работают и в Linux, и в macOS. Дополнительные расширения зависят от версии, и о них лучше смотреть в man touch.
| Ключ | Что делает |
|---|---|
| -c | не создавать файл, если его нет |
| -a | менять только время доступа |
| -m | менять только время изменения |
| -t время | задать время в формате [[CC]YY]MMDDhhmm[.SS] |
| -r эталон | взять время у другого файла |
Пример: touch -t 202501011200 notes.txt устанавливает время изменения и доступа на первое января 2025 года, 12:00. Формат записи неудобен тем, что цифры идут слитно, и ошибка в одной из них даёт другую дату. После команды проверьте результат через ls -l.
Ключ -r особенно полезен: touch -r original.txt copy.txt копирует метки времени с одного файла на другой. Так делают, чтобы копия выглядела неотличимой по времени.
Ключ -d тоже есть, но форматы даты у него в GNU и BSD версиях разные: GNU принимает и дату словами, а BSD — более строгую запись. Универсальный вариант — -t. Изменить время смены метаданных (ctime) touch не может: оно обновляется системой на текущее время при любом таком изменении.
Как touch помогает в других командах
Метки времени используются многими утилитами, поэтому touch часто выступает вспомогательным инструментом. Вот несколько типовых связок.
- find -newer. Создайте «метку» в нужный момент командой touch marker, а позже выполните find . -newer marker, чтобы увидеть всё, что менялось после неё. Приём описан в статье про find.
- rsync. По умолчанию rsync сравнивает размер и время изменения. Если время файла поменять, программа сочтёт его изменённым и передаст заново. Поэтому «лишнее» касание touch может увеличить список передачи; проверяйте это через пробный запуск.
- Скрипты и задачи по расписанию. Пустой файл-флаг (touch done.flag) служит сигналом, что этап выполнен, а команда test -e проверяет его наличие.
- Журналы. Создать пустой файл журнала до записи в него удобно, если программа сама этого не делает: touch app.log.
Заметьте, что касание не изменяет содержимое: размер пустого файла остаётся нулевым. Если вы хотите именно очистить существующий файл, это другая задача, решаемая перенаправлением, и делать её нужно осторожно, так как данные пропадут.
Права и типичные ошибки
Команда touch сообщает об ошибке, когда не может выполнить действие. Самые частые случаи собраны в таблице.
| Сообщение | Что значит | Что проверить |
|---|---|---|
| Permission denied | нет права записи в папку (для создания) или в файл (для смены времени) | права и владелец командой ls -l, при необходимости stat |
| No such file or directory | указанной папки не существует | создать папку через mkdir или поправить путь |
| Не создаётся файл при -c | это ожидаемое поведение ключа | убрать -c |
| Время не поменялось | файловая система или ключ ограничивают изменение | проверить ключи и повторить без -a или -m |
Если файл принадлежит другому пользователю, обновить время до текущего можно при наличии права записи в файл, а вот задать произвольное время (ключи -t, -r, -d) обычно может только владелец или администратор; в последнем случае сработает sudo touch. Но если вы используете sudo для создания файлов в своей домашней папке, они окажутся принадлежащими администратору, и позже обычный пользователь не сможет их изменить. Исправить это помогает смена владельца, об этом статья про chown.
Не создавайте файлы в системных каталогах без необходимости. Для экспериментов хватает собственной тестовой папки: так вы видите результат каждой команды и не рискуете чужими данными. Если нужно создать файл в каталоге, где у вас нет права записи, сначала выясните, кому принадлежит этот каталог и зачем туда нужен новый файл, а уже потом решайте, нужны ли повышенные права.
Шпаргалка и безопасные эксперименты
Чтобы закрепить материал, пройдите небольшой сценарий в тестовой папке. Он не затрагивает никаких данных, кроме созданных вами файлов.
- mkdir ~/touch-test && cd ~/touch-test
- touch first.txt — создаёт пустой файл; посмотрите ls -l.
- touch -t 202001011200 first.txt — выставляет старую дату; снова ls -l.
- touch first.txt — возвращает текущее время.
- touch -c nothing.txt — файл не создаётся, потому что он не существовал.
- touch -r first.txt second.txt — создаёт second.txt (если его нет) и копирует время с first.txt.
Убедитесь в каждом шаге через ls -l или stat. После опытов удалите тестовую папку командой rm -r ~/touch-test, проверив путь глазами: удаление необратимо.
Если команда touch вам нужна для массовых операций, комбинируйте её с find и xargs, но сначала просматривайте список файлов без изменений. А для просмотра точных времён, включая различия mtime, atime и ctime, возвращайтесь к статье про stat.