Как я могу изменить время "последнего изменения" (или "последнего изменения") файлов в Linux?
Я старался touch -t
, но его точность составляет всего одну секунду: когда я использую stat
Я вижу есть 9 цифр все ноль после десятичной дроби (.
):
Access: 2013-10-10 15:12:00.000000000 +0200
Modify: 2013-10-10 15:12:00.000000000 +0200
Change: 2015-11-22 18:39:54.369524868 +0100
Как изменить время "последнего изменения" и "последнего изменения" файлов с точностью до 9 чисел после десятичной точки?
2 ответа
Использовать -d
флаг вместо.
touch -m -d '2015-01-01 01:01:01.123456789' file.ext
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
указывает на то, что может).
Стиль POSIX по умолчанию -t
опция, как отмечается, ограничена разрешением в 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
).