← Весь справочник

touch

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

touch делает две разные вещи. Если файла нет — создаёт пустой. Если есть — ставит ему время доступа (atime) и изменения (mtime) на текущее или заданное, содержимое не трогает. В песочнице — GNU coreutils 9.4.

Синтаксис

touch [опции] файл…

Три времени файла

ВремяЧто значитКак посмотретьМожно задать touch?
atime (access)последнее чтениеstat -c %x, ls -luда, -a
mtime (modify)последнее изменение содержимогоstat -c %y, ls -lда, -m
ctime (change)последнее изменение метаданных: прав, владельца, имени, любых времёнstat -c %z, ls -lcнет — ядро ставит текущее время при любом touch

Опции

Что менять

ОпцияЧто делает
(без опций)atime и mtime = сейчас; нет файла — создать пустой
-aменять только atime
-mменять только mtime
--time=atime / --time=mtimeто же, что -a / -m
-cне создавать файл, если его нет (тихо, код возврата 0)
-hменять время самой символической ссылки, а не её цели

Какое время поставить

ОпцияФормат
-d 'строка'свободная дата, как у date -d: '2024-03-15 14:30', '2024-03-15T14:30:00Z', 'yesterday', '2 hours ago', '-1 day', 'next monday', '@1700000000' (секунды Unix)
-t [[ВВ]ГГ]ММДДччмм[.сс]строгий формат: -t 202403151430.59 → 2024-03-15 14:30:59
-r файлвзять время из другого файла
-r файл -d '+1 hour'время другого файла плюс сдвиг

Время без пояса трактуется в текущем поясе (TZ). В песочнице это UTC.

Примеры

# создать пустые файлы
touch app.log error.log

# «обновить» файл, чтобы make или find считали его свежим
touch src/main.c

# поставить дату в прошлом
touch -d '2024-01-01 00:00' old.txt
touch -d '30 days ago' stale.log

# то же через строгий формат
touch -t 202401010000 old.txt

# скопировать время с одного файла на другой
touch -r original.conf restored.conf

# поменять только время доступа
touch -a -d 'yesterday' data.csv

# только обновить существующие, ничего не создавая
touch -c *.lock

# метка для find: найти всё, что изменилось после неё
touch /tmp/mark
find /etc -newer /tmp/mark

Подводные камни

  • ctime не подделать. После touch -d '2020-01-01' mtime и atime станут 2020 годом, а ctime — текущим моментом. По ctime видно, что файл «трогали».
  • По умолчанию меняются оба времени — и atime, и mtime. Только одно — через -a или -m.
  • Символическая ссылка. Без -h touch ссылка меняет время цели, а если цели нет — создаёт её.
  • Каталог назначения должен существовать: touch /nodir/x — «No such file or directory». touch не делает mkdir -p.
  • -t — не -d. -t '2024-01-01' даст «invalid date format»: -t понимает только цифры ГГГГММДДччмм.
  • touch не очищает файл. Чтобы обнулить существующий файл, нужен : > файл или truncate -s 0.

См. также

stat · ls · find · date · truncate · make