Гид по технологиям

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

7 min read Linux Обновлено 01 Dec 2025
Команда touch в Linux — создание файлов и меток
Команда touch в Linux — создание файлов и меток

Чёрный и серебристый ноутбук с мобильным устройством — иллюстрация к статье о touch

Оглавление

  • Как работает команда 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} не даст ожидаемого результата без дополнительных приёмов).

Проверка размера пустых файлов с помощью ls и stat

Параметры 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

Отображение atime и mtime после изменения с опцией -t

Использование эталонного файла

Чтобы скопировать временные метки с одного файла на другой, используйте -r:

ls -l

(посмотреть текущие метки), затем:

touch -r new_file.txt happy.txt

Проверить результат:

ls -l

Сопоставление времени файлов до и после использования -r

Альтернативы 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 {} +

Примеры полезны, когда нужно массово обновить метки для систем бэкапа или тестирования.

Частые ошибки и отладка

  1. Ошибка доступа (Permission denied)

    • Причина: у вас нет прав на запись в директорию или файл защищён флагом immutable.
    • Решение: используйте sudo или измените права/флаги (chown, chmod, chattr).
  2. Файл не создаётся с -c (no-create)

    • Поведение ожидаемое: опция -c запрещает создание новых файлов.
  3. Неправильный формат для -t

    • Проверяйте формат [[CC]YY]MMDDhhmm[.ss]. На macOS/FreeBSD поддержка дробной секунды либо отсутствует, либо реализована иначе.
  4. Timestamp не меняется при смонтированной файловой системе с опцией noatime или relatime

    • Решение: проверьте опции монтирования через mount или /etc/fstab.
  5. Различия между GNU и BSD реализациями

    • На BSD-системах могут отличаться опции -d и формат даты; читайте man touch на вашей системе.

Рольовые чек-листы и SOP

Чек-лист для разработчика (когда нужен пустой файл в репозитории или тесте):

  • Убедиться, что имя файла корректно и не конфликтует с существующими файлами.
  • Выполнить touch <имя_файла>.
  • Проверить stat/ls, что Size 0 и метки установлены как нужно.

Чек-лист для системного администратора (массовое обновление для бэкапа):

  • Проверить текущую политику монтирования (noatime/relatime).
  • Создать резервную копию конфигураций, если меняете массово метки.
  • Использовать find + touch с тестовым запуском в ограниченной директории.
  • Проверить логи бэкапа после обновления меток.

SOP: массовое обновление меток перед тестовым бэкапом

  1. Выполнить dry-run: find /data/test -type f -print | head
  2. Обновить: find /data/test -type f -exec touch {} +
  3. Проверить выборочные файлы через stat.
  4. Запустить бэкап и верифицировать SLI/SLO (если применимо).

Мини-методология: как выбрать правильный способ

  • Нужен пустой файл без содержимого — используйте touch.
  • Нужна точная временная метка (прошлая/будущая) — используйте touch -t или -d.
  • Нужен массовый контроль — комбинируйте find и touch.
  • Не хотите создавать новый файл — добавьте -c.

Тесты и критерии приёмки

Тест-кейсы для автоматической проверки использования touch в CI/CD:

  1. Создание файла

    • Команда: touch ci_test.txt
    • Ожидаемый результат: файл существует, stat показывает Size 0
  2. Обновление atime только

    • Шаг: запомнить mtime, выполнить touch -a file
    • Ожидаемый результат: mtime не изменился, atime обновился
  3. Установка конкретной даты

    • Команда: touch -t 202001010101.01 file
    • Ожидаемый результат: stat показывает 2020-01-01 01:01:01
  4. 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 {} +

Отладка: пошаговый план

  1. Проверьте права доступа: ls -ld директория и ls -l файл.
  2. Если Permission denied — попытка с sudo: sudo touch file
  3. Проверьте флаги файловой системы: lsattr файл (для ext-подобных систем)
  4. Убедитесь, что формат времени корректен для вашей реализации touch.
  5. Смотрите 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.

Поделиться: X/Twitter Facebook LinkedIn Telegram
Автор
Редакция

Похожие материалы

hiberfil.sys — что это и как удалить
Windows

hiberfil.sys — что это и как удалить

Как изменить язык виджетов в Windows 11
Windows

Как изменить язык виджетов в Windows 11

Лучший телевизор для домашнего кинотеатра
Домашний кинотеатр

Лучший телевизор для домашнего кинотеатра

Ремонт и улучшение геймпада — проблемы и решения
Геймпады

Ремонт и улучшение геймпада — проблемы и решения

Outlook: открывать ответы в новом окне
Руководство

Outlook: открывать ответы в новом окне

Как сохранить голосовые сообщения на Android
Мобильные советы

Как сохранить голосовые сообщения на Android