touch
команда позволяет изменить время модификации и / или время доступа . Вы не можете установить время изменения произвольно: оно установлено на время, когда вы изменяете любой из двух других раз.
Причина этого заключается в том, что touch
зависит от системного вызова, который может выполнять только комбинации, указанные выше. Исходный код (в GNU coreutils) использует этот блок:
ok = (fdutimensat (fd, AT_FDCWD, (fd == STDOUT_FILENO ? NULL : file), t,
(no_dereference && fd == -1) ? AT_SYMLINK_NOFOLLOW : 0)
== 0);
который в свою очередь (см. источник) называет futimens
или utimensat
. Обе эти функции POSIX, который отмечает
После завершения futimens()
и utimensat()
должны пометить последнюю отметку времени изменения статуса файла для обновления.
Отметка времени изменения статуса - это то, что вы не можете установить произвольно.
Две функции POSIX принимают параметры timespec
, которые обеспечивают разрешение в наносекундах. Файловая система вашего компьютера может поддерживать или не поддерживать это (хотя результат из stat
указывает, что это возможно).
Как отмечалось, опция -t
умолчанию в стиле POSIX ограничена разрешением в 1 секунду. Однако (все еще POSIX) опция -d
предусматривает доли секунды:
YYYY-MM-DDThh:mm:SS[.frac][tz]
GNU coreutils поддерживает эту опцию -d
, что позволяет наносекундное разрешение. Документация для touch
дает в качестве примера
--date="2004-02-27 14:19:13.489392193 +0530"
(где --date
- длинное имя, эквивалентное -d
).