如何更改 Linux 上文件的“上次修改时间”(或“上次更改”)?

如何更改 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位的精度?

答案1

-d改用标志。

touch -m -d '2015-01-01 01:01:01.123456789' file.ext

答案2

touch命令允许您更改修改时间和/或使用权时间。您无法设置改变任意时间:即设置为您改变另外两个时间中的任意一个的时间。

这样做的原因是touch依赖于只能执行上述组合的系统调用。源代码(在 GNU coreutils 中)使用这个块:

  ok = (fdutimensat (fd, AT_FDCWD, (fd == STDOUT_FILENO ? NULL : file), t,
                     (no_dereference && fd == -1) ? AT_SYMLINK_NOFOLLOW : 0)
        == 0);

反过来(见来源) 调用futimensutimensat。这些函数都是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)。

相关内容