linux files

touch

Создать пустой файл или обновить временные метки существующего файла

Описание

touch — утилита с двойным назначением: создание новых пустых файлов и обновление временных меток (timestamps) существующих файлов. Команда появилась в ранних версиях Unix как инструмент управления временем доступа и модификации — отсюда название «touch» (прикоснуться).

Каждый файл в Linux имеет три временные метки: atime (access time — время последнего доступа), mtime (modification time — время последнего изменения содержимого) и ctime (change time — время последнего изменения метаданных). Команда touch обновляет atime и mtime до текущего времени или до указанного значения.

Самый распространённый сценарий на практике — создание пустых файлов-заглушек: конфигурационных файлов, файлов-маркеров для систем сборки (Makefile), файлов блокировок, тестовых фикстур. Также touch незаменим при работе с инструментами типа make, которые принимают решение о пересборке на основе временных меток файлов.

Синтаксис

touch [ОПЦИИ] ФАЙЛ...

Формат времени для флага -t:

[[CC]YY]MMDDhhmm[.ss] # Пример: 202506151430.00 = 15 июня 2025, 14:30:00

Формат строки времени для флага -d (человекочитаемый):

touch -d "2025-06-15 14:30:00" file.txt touch -d "yesterday" file.txt touch -d "2 hours ago" file.txt

Флаги и опции

Флаг Описание Пример
-a Обновить только время доступа (atime), не изменять mtime touch -a file.txt
-m Обновить только время модификации (mtime), не изменять atime touch -m file.txt
-c, --no-create Не создавать файл, если он не существует (только обновить метки) touch -c missing.txt
-d, --date=STRING Установить время из строки в человекочитаемом формате touch -d "2025-01-01" f.txt
-t STAMP Установить время в формате [[CC]YY]MMDDhhmm[.ss] touch -t 202501011200 f.txt
-r FILE, --reference=FILE Скопировать временные метки из указанного файла-эталона touch -r source.txt dest.txt
-h, --no-dereference Обновить метки символической ссылки, а не файла, на который она указывает touch -h symlink
--help Показать справку и выйти touch --help
--version Показать версию утилиты и выйти touch --version

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

Создать пустой файл

touch newfile.txt
touch config.yaml README.md .gitkeep

Если файл не существует, touch создаёт его пустым. Можно создать несколько файлов одной командой.

Создать файл-маркер для git (пустая директория)

mkdir -p logs
touch logs/.gitkeep

Git не отслеживает пустые директории. Файл .gitkeep (или .keep) — общепринятое соглашение для фиксации пустой папки в репозитории.

Обновить метку времени для make

# Принудить make к пересборке зависимого таргета
touch src/main.c
make

make сравнивает временные метки исходников и артефактов. Обновление метки исходника заставит make пересобрать цель.

Установить конкретную дату

touch -d "2025-06-15 09:00:00" report.pdf
touch -t 202506150900 report.pdf

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

Скопировать метки времени из другого файла

touch -r original.txt copy.txt

Файл copy.txt получит те же atime и mtime, что и original.txt. Удобно при клонировании окружений или тестовых данных.

Создать серию файлов по шаблону

touch file{1..5}.txt
# создаст: file1.txt file2.txt file3.txt file4.txt file5.txt

touch 2025-{01..12}-report.md

Bash-раскрытие диапазонов позволяет создавать серии файлов с именами по шаблону.

Советы и предупреждения

Совет: touch vs. redirect для создания файлов
Оба варианта создают пустой файл: touch file.txt и > file.txt. Но touch безопаснее — если файл уже существует, он не затирает его содержимое, а только обновляет метку. Оператор > очистит существующий файл.
Совет: проверить метки времени
Используйте stat file.txt для просмотра всех трёх временных меток файла (Access, Modify, Change). Команда ls -l показывает только mtime, а ls -lu — atime.
Совет: .gitkeep vs. .gitignore
Для отслеживания пустых директорий можно также добавить в них пустой .gitignore (он будет работать как .gitkeep и дополнительно позволит настроить игнорирование в этой папке). Оба подхода распространены в профессиональных проектах.
Внимание: ctime не обновляется через -d или -t
Флаги -d и -t позволяют задать произвольное atime/mtime, но ctime (время изменения метаданных) всегда выставляется в текущий момент ядром ОС и не может быть задано вручную через touch без привилегий суперпользователя.
Внимание: noatime в mount-опциях
На многих современных системах файловая система примонтирована с опцией noatime или relatime для повышения производительности. В таких системах флаг -a (обновить только atime) может не дать видимого эффекта — atime обновляется только при реальном чтении.