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

Оглавление
- Как работает команда touch
- Создать пустой файл
- Создать несколько пустых файлов
- Параметры touch
- Изменение времени доступа (atime)
- Изменение времени модификации (mtime)
- Изменение обеих меток одновременно
- Задать конкретную дату/время
- Использование эталонного файла
- Альтернативы touch
- Частые ошибки и отладка
- Рольовые чек-листы и SOP
- Тесты и критерии приёмки
- Краткое резюме
Как работает команда touch
В UNIX-подобных системах touch служит для двух основных задач:
- создать пустой файл, если он не существует;
- обновить временные метки файла — время последнего доступа (atime) и время последней модификации (mtime) — без изменения содержимого.
Если файл не существует, touch создаёт его с нулевым размером. Если файл существует, touch обычно обновляет обе метки до текущего времени. Команда проста, но полезна в сценариях автоматизации, при подготовке данных для тестов и при управлении бэкапами.
Синтаксис (обобщённый):
touch [опции]... файл...Пояснение терминов в одну строку:
- atime — время последнего чтения/доступа к файлу; mtime — время последнего изменения содержимого файла.
Создать пустой файл
Чтобы создать пустой файл, выполните:
touch newfile.txtПроверка размера и меток:
stat newfile.txtВ выводе ищите поле Size — если 0, файл пуст.
Важно: touch не открывает текстовый редактор и не добавляет содержимого.
Создать несколько пустых файлов
Можно создать сразу несколько файлов через пробел:
touch file1.txt file2.txt file3.txtПроверка:
ls -l *.txtПример с использованием расширения фигурными скобками (brace expansion):
touch file{1..3}.txtИли буквенная серия:
touch file_{a..e}.txtСовет: shell-расширение выполняет генерацию имён, а touch просто принимает окончательный список имён файлов.
Ограничение: brace expansion в bash/зависимом shell не смешивает числа и буквы в одной группировке (например, file{1..3,a..c} не даст ожидаемого результата без дополнительных приёмов).

Параметры touch
Ниже таблица часто используемых опций touch:
| Опция | Описание |
|---|---|
| -a | Обновляет только время доступа (atime). |
| -c, –no-create | Не создавать файл, если он не существует. |
| -d, –date=СТРОКА | Установить временную метку, разбирая строку даты (поддержка GNU date-кода). |
| -m | Обновляет только время модификации (mtime). |
| -r, –reference=ФАЙЛ | Установить метки по образцу другого файла. |
| -t СТРОКА | Установить временную метку в формате [[CC]YY]MMDDhhmm[.ss]. |
Примечание: детали форматирования строки для -d зависят от реализации ядра и утилит в дистрибутиве. На системах BSD поведение может отличаться от GNU coreutils.
Изменение времени доступа (atime)
atime обновляется при чтении содержимого файла. Чтобы изменить только atime, используйте:
touch -a happy.txtЭто установит atime на текущее системное время, не затрагивая mtime.
Проверка (показывает время доступа):
ls -lu happy.txtЕсли нужно установить конкретное время доступа, комбинируйте -a с -t:
touch -a -t 201006010000 happy.txtЗдесь формат 201006010000 означает 2010-06-01 00:00.


Изменение времени модификации (mtime)
mtime обновляется при изменении содержимого файла. Изменить только mtime:
touch -m happy.txtПроверка через stat:
stat happy.txtЧтобы задать конкретное время модификации:
touch -m -t 201406190845.00 happy.txt(Формат: [[CC]YY]MMDDhhmm[.ss]).

Изменение обеих меток одновременно
По умолчанию touch без опций обновит и atime, и mtime:
touch happy.txtЕсли хотите принудительно указать и atime, и mtime через опции, можно комбинировать -a и -m, но это избыточно, если нужен текущий момент:
touch -a -m happy.txtПроверка:
stat happy.txtЗадать конкретную дату/время
Чтобы установить одновременно обе метки на конкретную дату/время используйте -t:
touch -t 202401011230.00 happy.txtЭто установит дату 2024-01-01 12:30:00. Альтернативно, с GNU touch можно использовать -d с человекочитаемой строкой:
touch -d "2024-01-01 12:30:00" happy.txt
Использование эталонного файла
Чтобы скопировать временные метки с одного файла на другой, используйте -r:
ls -l(посмотреть текущие метки), затем:
touch -r new_file.txt happy.txtПроверить результат:
ls -l
Альтернативы touch
Если touch по каким-то причинам недоступен или вы хотите обойтись другими инструментами:
- cat с перенаправлением:
cat > filename.txt
# нажать Ctrl+D — файл создастся (может остаться пустым)- Перенаправление пустой команды:
>filename.txt- printf для создания файла с содержимым или пустым строковым содержимым:
printf "" > filename.txt- Текстовый редактор (vim, nano):
vim file1.txt- Команды для массового создания/обновления в скриптах:
for i in {1..100}; do touch "file_$i.txt"; done- Использование find для массового обновления временных меток:
find /path/to/dir -type f -exec touch {} +Примеры полезны, когда нужно массово обновить метки для систем бэкапа или тестирования.
Частые ошибки и отладка
Ошибка доступа (Permission denied)
- Причина: у вас нет прав на запись в директорию или файл защищён флагом immutable.
- Решение: используйте sudo или измените права/флаги (chown, chmod, chattr).
Файл не создаётся с -c (no-create)
- Поведение ожидаемое: опция -c запрещает создание новых файлов.
Неправильный формат для -t
- Проверяйте формат [[CC]YY]MMDDhhmm[.ss]. На macOS/FreeBSD поддержка дробной секунды либо отсутствует, либо реализована иначе.
Timestamp не меняется при смонтированной файловой системе с опцией noatime или relatime
- Решение: проверьте опции монтирования через mount или /etc/fstab.
Различия между GNU и BSD реализациями
- На BSD-системах могут отличаться опции -d и формат даты; читайте man touch на вашей системе.
Рольовые чек-листы и SOP
Чек-лист для разработчика (когда нужен пустой файл в репозитории или тесте):
- Убедиться, что имя файла корректно и не конфликтует с существующими файлами.
- Выполнить touch <имя_файла>.
- Проверить stat/ls, что Size 0 и метки установлены как нужно.
Чек-лист для системного администратора (массовое обновление для бэкапа):
- Проверить текущую политику монтирования (noatime/relatime).
- Создать резервную копию конфигураций, если меняете массово метки.
- Использовать find + touch с тестовым запуском в ограниченной директории.
- Проверить логи бэкапа после обновления меток.
SOP: массовое обновление меток перед тестовым бэкапом
- Выполнить dry-run: find /data/test -type f -print | head
- Обновить: find /data/test -type f -exec touch {} +
- Проверить выборочные файлы через stat.
- Запустить бэкап и верифицировать SLI/SLO (если применимо).
Мини-методология: как выбрать правильный способ
- Нужен пустой файл без содержимого — используйте touch.
- Нужна точная временная метка (прошлая/будущая) — используйте touch -t или -d.
- Нужен массовый контроль — комбинируйте find и touch.
- Не хотите создавать новый файл — добавьте -c.
Тесты и критерии приёмки
Тест-кейсы для автоматической проверки использования touch в CI/CD:
Создание файла
- Команда: touch ci_test.txt
- Ожидаемый результат: файл существует, stat показывает Size 0
Обновление atime только
- Шаг: запомнить mtime, выполнить touch -a file
- Ожидаемый результат: mtime не изменился, atime обновился
Установка конкретной даты
- Команда: touch -t 202001010101.01 file
- Ожидаемый результат: stat показывает 2020-01-01 01:01:01
No-create флаг
- Команда: touch -c nonexistent
- Ожидаемый результат: файл не создан, команда завершилась без ошибки
Критерии приёмки: все тесты должны проходить в таргетной среде (тот же дистрибутив и версия coreutils).
Советы по безопасности и приватности
- Тimestamps могут служить косвенной информацией о рабочих процессах; при публикации файлов учтите, что mtime/atime могут раскрывать временные данные. При необходимости обнуляйте метки перед публикацией.
- При массовом изменении меток убедитесь, что это не нарушит логи архивации и не приведёт к проблемам с дедупликацией.
Сценарии, когда touch не подходит
- Нужно записать содержимое файла — используйте echo/printf/cat или редактор.
- Требуется атомарная запись с контролем версий — используйте специализированные инструменты (git, rsync с –backup).
- Работаете в файловой системе с ограниченными атрибутами (реестр immutable) — сначала снимите флаг.
Быстрые шпаргалки (cheat sheet)
- Создать файл: touch file
- Создать несколько: touch a b c
- Создать с нумерацией: touch file{1..5}.txt
- atime только: touch -a file
- mtime только: touch -m file
- обе метки на дату: touch -t 202301011200.00 file
- скопировать метки: touch -r src dest
- не создавать: touch -c new
- массово: find . -type f -exec touch {} +
Отладка: пошаговый план
- Проверьте права доступа: ls -ld директория и ls -l файл.
- Если Permission denied — попытка с sudo: sudo touch file
- Проверьте флаги файловой системы: lsattr файл (для ext-подобных систем)
- Убедитесь, что формат времени корректен для вашей реализации touch.
- Смотрите syslog/journal при неожиданных ошибках.
Совместимость и миграция
- GNU coreutils (Linux) предоставляет расширенные опции -d и гибкую обработку дат.
- BSD/macOS touch поддерживает большинство базовых опций, но некоторые расширения могут отличаться. Всегда проверяйте man touch на целевой системе.
- В скриптах, предназначенных для разных ОС, добавляйте проверки окружения и fallback-ветви.
Полезный сценарий: подготовка тестовой директории
mkdir -p /tmp/test_touch
cd /tmp/test_touch
for i in {1..10}; do touch "sample_${i}.log"; done
# установить все файлы на дату 2000-01-01
for f in sample_*.log; do touch -t 200001010000 "$f"; done
ls -lКраткое резюме
Команда touch — лёгкий и надёжный инструмент для создания пустых файлов и управления временными метками. Она хорошо интегрируется в скрипты и процедуры бэкапа. Помните о правах доступа и различиях между реализациями на разных платформах.
Image credit: Unsplash. Все скриншоты и изменения — Haroon Javed.
Похожие материалы
hiberfil.sys — что это и как удалить
Как изменить язык виджетов в Windows 11
Лучший телевизор для домашнего кинотеатра
Ремонт и улучшение геймпада — проблемы и решения
Outlook: открывать ответы в новом окне