Команда touch в Linux — создание файлов и управление метками времени
Quick Links
What Is the touch Command?
Creating Empty Files
Set the Access Time to the Current Time
Set the Modification Time to the Current Time
Setting Access and Modification Times to Specific Times
Set Only One Time to a Specific Value
Set the Access and Modification Times to Those of Another File
Don’t Create a File, Only Modify Existing Files
A touch of Class
Краткое резюме
- Команда touch обновляет метки доступа (atime) и изменения (mtime) файлов — полезно, чтобы гарантировать включение файлов в бэкап, сборки и другие автоматические процессы.
- Для создания пустого файла используйте touch new-file.txt.
- Флаги -m и -a обновляют mtime и atime соответственно; -t и -d позволяют задать конкретную дату/время; -r копирует метки из другого файла; -c запрещает создание новых файлов.
В этой статье подробно описаны варианты использования touch, полезные приёмы, альтернативы, ограничения и практические инструкции для разных ролей.
Что такое команда touch?
Команда touch входит в GNU coreutils и доступна на большинстве дистрибутивов Linux. Исторически она появилась ещё в ранних версиях Unix. Основная её задача — установить значения меток времени файла: времени последнего доступа (atime) и времени последнего изменения содержимого (mtime). По умолчанию touch также создаёт пустой файл, если указанный файл отсутствует — это удобный побочный эффект.
Краткое определение терминов:
- atime — время последнего доступа (чтение или открытие файла);
- mtime — время последнего изменения содержимого;
- ctime — время последнего изменения метаданных (изменение прав, владельца, или изменение inode).
Важно: touch изменяет только atime и mtime; ctime меняется автоматически, когда меняются метаданные файла.
Создание пустых файлов
Создавать пустые файлы проще простого:
touch new-file.txt
touch ~/Documents/outlines/rough-outline.txt
ls *.txt
ls ~/Documents/outlines/*.txt
Файл будет создан в файловой системе с нулевым размером — фактически это запись имени и inode. Проверка через ls и stat показывает нулевой размер, но файл присутствует:
ls -hl new-file.txt
Для создания нескольких файлов перечислите их имена через пробел:
touch new-file-2.txt new-file-3.txt new-file-4.txt
ls *.txt
Если имена файлов следуют последовательной нумерации, используйте расширение оболочки:
touch even-more-files-{1..6}.txt
ls even*
Совет: touch удобен для заготовок, placeholder-файлов и для инициализации структуры каталогов перед выполнением скриптов.
Установить время доступа (atime) на текущее системное время
Для демонстрации используем файл sample-file.txt и команду stat, чтобы увидеть метки времени:
stat sample-file.txt
Чтобы обновить только метку доступа на текущее время, используйте флаг -a:
touch -a sample-file.txt
stat sample-file.txt
Обратите внимание, что изменение atime считается изменением файла, поэтому ctime (время изменения метаданных) тоже обновляется.
Важно: поведение atime может зависеть от настроек монтирования файловой системы (например, relatime, noatime) — в некоторых конфигурациях файловая система не будет обновлять atime при чтении для снижения дисковых операций.
Установить время изменения (mtime) на текущее системное время
Для обновления только mtime используйте -m:
touch -m sample-file.txt
stat sample-file.txt
Это полезно, чтобы заставить инструменты сборки (например, make) повторно обработать файл, имитируя его недавнее изменение.
Установка atime и mtime на конкретную дату/время
Есть два способа задать конкретные значения одновременно: -d (date) и -t (timestamp). Отличие в формате строки, которую вы передаёте.
- -d принимает свободную, человекочитаемую строку времени: “Wed, 7 August 2024 16:00:00”, “2024-07-11 16:00:00”, или даже слова вроде “next Sunday”.
- -t требует жёсткого формата: [[CC]YY]MMDDhhmm[.ss]
Формат -t: сначала месяц и день, затем часы и минуты, секунда после точки опциональна. Годы можно указывать частично; при отсутствии CC/YY предполагается текущий год.
Пример с -d:
touch -d "Wed, August 7 2024 16:00:00" sample-file.txt
stat sample-file.txt
Пример с -t: установим метки на полночь в Halloween этого года (2410310000.00 — формат: 24YYMMDDhhmm.ss):
touch -t 2410310000.00 sample-file.txt
stat sample-file.txt
Совет по формату: чтобы избежать ошибок при ручном наборе дат, предпочитайте -d с ISO-подобной строкой (YYYY-MM-DD HH:MM:SS).
Установить только одну метку времени на конкретное значение
Флаги -t и -d по умолчанию изменяют обе метки (atime и mtime). Флаги -a и -m изменяют только одну метку, но если используются без -t/-d, они устанавливают метку на текущее время.
Чтобы установить только одну метку на произвольную указанную дату, комбинируйте флаги: сначала указывайте -a или -m, затем -t или -d.
Пример: установить только mtime на 11:45 21 декабря 2024 года. В формате -t (без CC/YY, предполагается текущий год): 12211145.00. Флаг -m должен идти перед -t:
touch -mt 12211145.00 sample-file.txt
stat sample-file.txt
Аналогично для atime используйте -at.
Совет: порядок ключей важен для читаемости и совместимости в некоторых оболочках; ставьте флаги в логичном порядке: сначала какой атрибут (-a/-m), затем способ задания времени (-t/-d).
Копирование меток времени с другого файла
Можно указать существующий файл в качестве эталона, и touch применит его atime и mtime к целевым файлам с помощью флага -r:
stat reference-file.txt
Применим метки времени эталона к одному или нескольким файлам (если целевой файл не существует, touch создаст его):
touch -r reference-file.txt sample-file.txt sample-2.txt
stat sample-file.txt sample-2.txt
Это удобно, когда вы хотите синхронизировать временные метки или имитировать порядок создания/изменения файлов.
Не создавать файл, изменить только существующие
По умолчанию touch создаёт файл, если его нет. Если нужно обновить только существующие файлы, используйте -c (no-create):
ls missing-in-action.txt
touch -c -mt 202409170900.00 sample-file.txt missing-in-action.txt
stat sample-file.txt
ls missing-in-action.txt
Результат: sample-file.txt обновлён, а missing-in-action.txt не создан.
Ограничения, ошибки и когда touch не сработает
Важно понимать случаи, когда touch не сможет изменить метки времени:
- Нет прав: если у вас нет прав на запись inode или на директорию, touch вернёт ошибку «Permission denied».
- Файловая система монтирована с ограничениями: некоторые параметры монтирования (например, noatime) влияют на поведение atime; сетевые FS могут не поддерживать точную установку времени (особенно с учётом таймзон и разрешения).
- Файл установлен с атрибутом immutable (chattr +i) — тогда любые изменения inode запрещены, включая обновление времён.
- Время вне допустимого диапазона: старые/будущие даты вне диапазона времени файловой системы могут привести к ошибке.
- SELinux/AppArmor: политики безопасности могут блокировать изменение меток.
Примеры ошибок и рекомендации:
- Если touch не меняет atime, проверьте параметры монтирования (mount | grep $(df –output=target sample-file.txt | tail -1)).
- Для сетевых шар (NFS, SMB) убедитесь, что клиент/сервер синхронизируют время и поддерживают utimes.
Альтернативы и дополняющие инструменты
- printf/echo с перенаправлением: создают файлы с содержимым, но не позволяют явно установить atime/mtime.
- touch в скриптах: используется совместно с find (-exec touch {} \;) для массовых операций.
- GNU utime/utimensat (системные вызовы) и утилиты на уровне API дают более гибкий контроль в программах на C/Python.
- rsync и tar сохраняют и восстанавливают метки времени при переносе/архивации.
Когда не использовать touch:
- Если нужно установить метки только на время создания (birth time), touch не меняет birth time на большинстве FS.
- Если нужно правдиво восстановить историю изменений — лучше использовать резервные копии с сохранением метаданных.
Практическая шпаргалка (cheat sheet)
Команды и их назначение:
# Создать файл (или обновить метки) на текущее время
touch file.txt
# Обновить только atime
touch -a file.txt
# Обновить только mtime
touch -m file.txt
# Установить конкретную дату/время (человеко-понятный формат)
touch -d "2024-08-07 16:00:00" file.txt
# Установить конкретную дату/время (жёсткий формат)
touch -t 202408071600.00 file.txt
# Установить только mtime на указанное значение
touch -mt 202412211145.00 file.txt
# Копировать время из reference.txt
touch -r reference.txt target.txt
# Не создавать файлы, только изменять существующие
touch -c file.txtИспользуйте абсолютные пути, когда работаете в скриптах, чтобы избежать неожиданных результатов при запуске из другого каталога.
Модели мышления и эвристики
- Если файл должен быть обработан заново инструментом сборки: обновите mtime (touch -m).
- Если нужно отметить файл как недавно прочитанный — обновите atime (touch -a), но будьте внимательны к параметрам файловой системы.
- Для массовых операций: сначала протестируйте команды на копии или в тестовом каталоге.
- Предпочитайте -d с ISO-форматом для читаемости и переносимости: “YYYY-MM-DD HH:MM:SS”.
Чек-листы по ролям
Системный администратор:
- Проверьте права доступа и атрибуты (lsattr, stat).
- Учтите параметры монтирования (noatime, relatime).
- Тестируйте на целевых файловых системах (локальные и сетевые).
Разработчик/DevOps:
- Используйте touch в CI для управления детекцией изменений сборщиками.
- Предпочитайте явные форматы дат в скриптах (-d с ISO).
- Логируйте операции touch в скриптах для отладки.
Менеджер резервного копирования:
- Используйте -r, чтобы синхронизировать метки после восстановления.
- Учитывайте поведение утилит архивации (tar, rsync) и сохраняйте метаданные.
Контрольные тесты и критерии приёмки
- Создание файла: touch test.txt — файл появляется с размером 0 и корректным uid/gid.
- Обновление mtime: установить mtime в прошлую дату и проверить stat показывает ожидаемую дату.
- Комбинация -m с -t: установить только mtime на указанную дату; atime остаётся неизменным.
- -c поведение: попытка touch -c on_missing.txt не создаёт файл.
- Копирование меток: touch -r source target — target получает одинаковые atime/mtime.
Критерии приёмки: все перечисленные тесты проходят на целевой системе (локально и в CI), условия доступа и параметры монтирования задокументированы.
Совместимость и отличия между системами
- GNU/Linux (coreutils): поддерживает -a, -m, -d, -t, -r, -c.
- BSD/macOS: touch поддерживает аналогичные опции, но синтаксис и поведение некоторых ключей (особенно -d) могут отличаться; macOS использует другой формат для некоторых строк, лучше проверять man touch.
- Сетевые файловые системы (NFS/SMB): могут иметь нюансы с разрешением времени и синхронизацией часов между клиентом и сервером.
Рекомендация: проверяйте поведение touch на целевой платформе перед массовым применением.
Безопасность и приватность
- Метки времени — часть метаданных файла; в некоторых юрисдикциях они могут считаться персональными данными, если позволяют восстановить поведение пользователя. При публикации файлов учитывайте, что изменение atime/mtime не удаляет исторические следы из резервных копий.
- Манипуляция метками времени может использоваться в попытках сокрытия действий (например, изменения метаданных для сокрытия времён модификации). Логируйте критичные операции и держите журнал изменений.
Примеры использования в сценариях
- Быстро пометить файл как недавно изменённый, чтобы заставить make пересобрать зависимость:
touch src/header.h
make- Синхронизировать метки времени после восстановления из архива:
# восстановили файлы, затем применили метку эталона
touch -r /path/to/backup/marker restored/file1 restored/file2- Подготовка placeholder-файлов в проекте:
mkdir -p project/{src,docs,tests}
cd project
touch README.md src/{main.c,module.c} tests/{test_main.c}Краткое резюме и рекомендации
- touch — простой и мощный инструмент для контроля меток времени и быстрого создания пустых файлов.
- Всегда учитывайте права доступа, параметры монтирования и специфику сетевых файловых систем.
- В скриптах используйте явные форматы (-d с ISO) и проверяйте поведение на целевой платформе.
Важно: перед массовыми операциями тестируйте команды в контролируемой среде.
Полезные ресурсы и ссылки
- man touch — полное руководство по опциям на вашей системе.
- coreutils documentation — для глубокого понимания реализации и совместимости.
Похожие материалы
Резервное копирование фото на Android — как и где хранить
Как скрыть полное имя в Slack
Bitwarden на Raspberry Pi Zero 2 W — самохостинг
Удалённый доступ к Mac: локально и через интернет
Как создать качественные обои для рабочего стола