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. - Символическая ссылка. Без
-htouch ссылкаменяет время цели, а если цели нет — создаёт её. - Каталог назначения должен существовать:
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.