我通过 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
=1541934000
32 位最小无符号时间 (1901-12-13 08:45:52
)之后的秒数2054-12-17 17:28:16
=1541934000
32 位最大有符号时间后的秒数 (2038-01-19 03:14:16
)
您的主目录可能存储在 NFSv3 上或以 32 位存储这些日期的本地文件系统上。
另一方面,由或任何以 64 位存储日期的文件系统/tmp
支持,因此不受该问题的影响。tmpfs
ext4