我尝试过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);
反过来(见来源) 调用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
)。