/tmp 中的“旧”文件与主目录中的“ls”输出时间戳不同

/tmp 中的“旧”文件与主目录中的“ls”输出时间戳不同

我通过 ssh 连接到我的大学 Linux 服务器 (RHEL 7)。我的问题与“ls”和“旧”文件有关。

主目录:

$ touch -d '1918-11-11 11:00 GMT' wwi-armistice
$ touch now
$ sleep 1
$ touch now1
$ TZ=UTC0 ls -lt --full-time wwi-armistice now now1
-rw-r--r-- 1 tsai csugrad 0 2054-12-17 17:28:16.000000000 +0000 wwi-armistice
-rw-r--r-- 1 tsai csugrad 0 2018-05-04 22:07:10.743637000 +0000 now1
-rw-r--r-- 1 tsai csugrad 0 2018-05-04 22:06:59.992632000 +0000 now

临时目录:

$ tmp=$(mktemp -d)
$ cd $tmp
$ touch -d '1918-11-11 11:00 GMT' wwi-armistice
$ touch now
$ sleep 1
$ touch now1
$ TZ=UTC0 ls -lt --full-time wwi-armistice now now1
-rw-r--r-- 1 tsai csugrad 0 2018-05-04 23:04:27.031485854 +0000 now1
-rw-r--r-- 1 tsai csugrad 0 2018-05-04 23:04:22.907373125 +0000 now
-rw-r--r-- 1 tsai csugrad 0 1918-11-11 11:00:00.000000000 +0000 wwi-armistice

我知道第一个输出显示 2054 年世界大战停战的原因与 Unix 时间的有符号 32 位到无符号 32 位转换有关。如果有人可以证实这一点,并可能解释原因(与网络有关?),那就太好了。

我的第二个更大的问题是:当我在 /tmp 中执行示例时,为什么正确列出了 wwi-armistice?

答案1

您运行的操作系统不足以识别行为差异的根本原因。同样重要的是用于存储文件访问和修改时间的文件系统。

正如您所猜测的,错误的 2054-12-17 日期是由于目标日期被写入为无符号 32 位整数,但读取为有符号 32 位整数。

  • 1918-11-11 11:00:00= 154193400032 位最小无符号时间 ( 1901-12-13 08:45:52)之后的秒数

  • 2054-12-17 17:28:16= 154193400032 位最大有符号时间后的秒数 ( 2038-01-19 03:14:16)

您的主目录可能存储在 NFSv3 上或以 32 位存储这些日期的本地文件系统上。

另一方面,由或任何以 64 位存储日期的文件系统/tmp支持,因此不受该问题的影响。tmpfsext4

相关内容