复制后文件修改时间戳发生改变

复制后文件修改时间戳发生改变

我的 Ubuntu 16.04.1 系统上有一个文件(gzip 压缩的 tar)。如果我从上下文菜单中获取其属性,则会显示

访问时间:2016 年 8 月 17 日星期三 01:39:46 修改时间:2016 年 8 月 17 日星期三 01:39:44

这对我来说完全说得通。现在我将这个文件复制到 USB 记忆棒上,并将其插入另一台计算机,复制文件的属性现在如下:

访问时间:2016 年 8 月 17 日星期三 00:00:00 修改时间:2016 年 8 月 16 日星期三 22:39:44

注意,复制文件的修改日期时间戳为-3h,访问时间戳可能未知?

这有意义吗?如果有意义,那么这里发生了什么?注意:日期/时间设置正确,现在肯定不是午夜。

答案1

在Linux中有3个定义:

struct timespec st_atim; /* 上次访问的时间 */
struct timespec st_mtim; /* 最后修改时间 */
struct timespec st_ctim; /* 上次状态改变的时间 */
参考“man 2 fstat”:
 字段 st_atime 会因文件访问而改变,例如
 execve(2)、mknod(2)、pipe(2)、utime(2) 和 read(2)(大于零
 字节)。其他例程(例如 mmap(2))可能会或可能不会更新 st_atime。

 字段 st_mtime 会因文件修改而改变,例如
 mknod(2)、truncate(2)、utime(2) 和 write(2)(超过零字节)。
 此外,目录的 st_mtime 会因创建或删除而改变
 该目录中的文件数。
 st_mtime 字段不会因所有者、组、硬链接的更改而改变
 计数,或者模式。

 字段 st_ctime 可以通过写入或设置 inode 信息来更改
 (即所有者、群组、链接数、模式等)。

注意:统计结构中字段的顺序在不同的架构中略有不同。

因此,如果您使用其他架构或非 UNIX 文件系统,则可能会出现此结果,这是由于 fstat 信息中有此描述。

答案2

只是为了完整性:

  1. 并非所有文件系统都处理所有时间:
    st_atime、st_mtime 和 st_ctime 肯定存储在 EXT2-3-4 中。
    这里其他计算机(至少是当天)理解了一些内容。
    这怀疑其他计算机使用的是基于 Windows 的操作系统。
  2. Linux 和 Windows 操作系统的文件访问时间之间存在 3 小时(或其他,四舍五入时间)的差异。
    这样做是因为 Linux 始终使用 UTC,而 Windows ... 并非总是,有时(在某些文件系统、某些程序中)使用本地时间。
    需要澄清的是... 您的本地时间是否正好与 UTC 相差 3 小时?
    但是,您可以要求 Windows 表现得更加一致:
    https://www.tenforums.com/general-support/123347-my-file-folder-timestamps-showing-wrong-time.html

相关内容