Команда touch в Linux: создание файлов и управление метками времени

Коротко о терминах
- mtime — время последней модификации содержимого файла.
- atime — время последнего доступа (чтения) файла.
- ctime — время последнего изменения метаданных (например, прав или владельца).
Зачем использовать touch
touch полезен при:
- создании пустых «заглушек» (placeholder) для тестов и скриптов;
- быстром обновлении временных меток для сборки/кэширования;
- синхронизации времён между файлами;
- восстановлении времён после операций копирования/архивации (в сочетании с резервными копиями).
Важно: touch не записывает данные в файл — он лишь изменяет метки времени или создаёт пустой файл при отсутствии такового (если не указан ключ, запрещающий создание).
Базовый синтаксис
touch [опции] имя_файла [...другие_файлы]Примеры:
# создать один пустой файл
touch newemptyfile
# создать сразу несколько
touch fileone filetwo filethreeЕсли файл уже существует, по умолчанию touch обновит его метки времени до текущего момента.
Частые опции и примеры
- -a — обновить только время доступа (atime).
- -m — обновить только время модификации (mtime).
- -c (или –no-create) — не создавать файл, если его нет.
- -t — задать время в специальном числовом формате.
- -d — задать время в виде человекопонятной строки (GNU touch).
- -r — скопировать метки времени из другого файла.
Примеры:
# обновить только atime
touch -a textfile
# обновить только mtime
touch -m textfile
# не создавать файл, если его нет
touch -c existfile
# задать время «5 часов назад» (GNU coreutils)
touch -d "5 hours ago" newfile
# скопировать метки времени из originalfile в copiedfile
touch -r originalfile copiedfileФормат даты для -t
Опция -t ожидает формат [[CC]YY]MMDDhhmm[.ss]. Примеры:
# 12 декабря 2020 21:00:33
touch -t 202012122100.33 newfile
# если указать без века: YYMMDDhhmm
touch -t 2012120900.00 fileПримечание: синтаксис может незначительно различаться между реализациями Unix-подобных систем, но [[CC]YY]MMDDhhmm[.ss] — стандартный формат в большинстве систем.
Использование date вместе с touch
Можно комбинировать date и touch для более гибких преобразований времени:
# взять mtime из другого файла и вычесть 5 часов
touch -d "$(date -r filename -d '-5 hours')" existfile
# альтернативный шаблон: использовать date для форматирования
touch -t "$(date -d '2020-12-12 21:00:33' +%Y%m%d%H%M.%S)" newfileЗамечание по совместимости: опции date -r и -d доступны в GNU date; на других платформах (например, BSD) синтаксис может отличаться.
Проверка меток времени: stat
Для просмотра текущих времён используйте stat:
stat filenameВывод содержит Access, Modify и Change. Пример вывода:
File: 'textfile'
Size: 13 Blocks: 8 IO Block: 4096 regular file
Access: 2021-04-12 16:59:45.000000000 +0000
Modify: 2021-04-12 16:57:59.000000000 +0000
Change: 2021-04-12 17:02:43.000000000 +0000Когда touch не сработает
- недостаточно прав (нужно иметь право на запись в каталог или на изменение файла);
- файл помечен как immutable (chattr +i на ext-подобных файловых системах);
- файловая система монтирована только для чтения;
- некоторым файловым системам чужды традиционные атрибуты времени (нестандартное поведение на сетевых шарингах или специальных виртуальных FS);
- при использовании ключа -c файл не создаётся — это ожидаемое поведение.
Альтернативы и дополнительные способы создания файлов
- перенаправление: > filename (создаёт пустой файл);
- printf ‘’ > filename или : > filename;
- cat > filename и ввод содержимого вручную;
- скрипты на Python/Perl: open(‘file’,’a’).close();
- графические файловые менеджеры в средах рабочего стола.
Когда использовать touch, а не >: touch удобен для явного управления метками времени и копирования их с других файлов.
Практические советы и лучшие практики
- Для CI/CD и тестов явно задавайте время, чтобы получить предсказуемое поведение сборки.
- Для сохранения оригинальных времён сделайте резервную копию меток времени (stat или сохранение output), прежде чем менять их.
- При автоматизации используйте проверку ошибок (проверка кода возврата) — touch вернёт ненулевой код при ошибках.
Сравнение флагов — шпаргалка
| Действие | Команда |
|---|---|
| Создать файл | touch file |
| Обновить только atime | touch -a file |
| Обновить только mtime | touch -m file |
| Не создавать новый файл | touch -c file |
| Установить дата/время (человеческий формат) | touch -d “2 days ago” file |
| Установить дата/время (число) | touch -t 202012122100.33 file |
| Скопировать метки из другого файла | touch -r src dst |
Mini-методология: безопасное изменение времён в проде
- Проверить права и файловую систему: ls -ld каталог; mount | grep путь.
- Зафиксировать текущие временные отметки: stat file > file.stat.backup.
- Выполнить touch с нужными опциями.
- Проверить результат stat и сохранять логи об операциях.
- При ошибках восстановить из бэкапа или пересоздать файл.
Ролевые чек-листы
Разработчик:
- использовать touch для создания заглушек;
- при тестах явно устанавливать mtime/atime для воспроизводимости;
- проверять права и возвращаемый код.
Системный администратор:
- использовать touch в скриптах обслуживания для управления кэшами;
- при массовом применении проверять совместимость с NFS/CIFS;
- хранить журналы операций.
Тестировщик:
- моделировать старые/новые файлы с touch -t/-d;
- проверять поведение кэширования и сборки при разных временных метках.
Критерии приёмки
- файл создан/существует в указанном каталоге;
- ожидаемые метки времени (atime/mtime/ctime) соответствуют заданным значениям;
- команда возвращает код 0 при успешном выполнении;
- при использовании -c файл не создаётся, если его не было.
Edge-case галерея и рекомендации
- NFS/CIFS: сетевые прописи времени могут отличаться из-за временных зон сервера и клиента — проверяйте синхронизацию времени (ntpd/chrony).
- immutable-файл: chattr -i filename (требуются права root) — затем touch применится.
- отсутствие записи в каталог: используйте sudo или измените права.
- FAT/NTFS на Linux: атрибуты времени сохраняются иначе, возможны ограничения с точностью секунд.
Чек-лист для быстрого применения (шпаргалка)
- создать файл: touch file
- задать человекопонятную дату: touch -d “3 days ago” file
- установить точную дату: touch -t 202501011200.00 file
- скопировать метки: touch -r src dst
- не создавать при отсутствии: touch -c file
Примеры реальных сценариев
- CI: установить mtime на файлов, чтобы сборщик не пересобирал ненужно.
- Логи: корректировать atime/mtime для тестов ротации логов.
- Восстановление: после распаковки архива выставить времена согласно метаданным архива.
Короткий словарь терминов
- mtime: время изменения содержимого.
- atime: время доступа/чтения.
- ctime: время изменения метаданных.
Заключение
Команда touch — лёгкий и мощный инструмент для управления файлами и их временными метками. Она незаменима в автоматизации, тестировании и администрировании. Зная основные опции (-a, -m, -c, -t, -d, -r) и ограничения файловых систем, вы сможете использовать touch безопасно и предсказуемо.
Важно: при изменении времён в критичных системах всегда делайте резервные копии и проверяйте совместимость с сетевыми файловыми системами.
Похожие материалы
Kodi на Linux: установка и настройка
Focus на Mac — настройка и советы
Goal Seek в Excel: как найти нужное значение
Как создать файл в Linux — все методы
Документы в Google Chat: создание и доступ