it-swarm.cn

文件的时间戳,修改时间和创建时间

我只知道ls -tls -f提供目录下文件和子目录的不同排序。

  • 文件的时间戳,修改时间和创建时间之间有什么区别?
  • 如何通过命令获取和更改此类信息?
  • 人们说哪种文件比另一种“新”的信息呢?
  • 哪种信息的更改不会使文件有所不同?

例如,我看到有人写道:

默认情况下,rsync程序仅查看文件的大小和时间戳是否不同。不管哪个文件是新的,如果文件不同,它都会被覆盖。您可以将'--update'标志传递给rsync,如果它们比源文件上的文件新,它将导致目标文件上的文件跳过,但前提是它们是相同类型的文件。这意味着,例如,如果源文件是常规文件,而目标是符号链接,则无论时间戳如何,目标文件都会被覆盖。

附带说明一下,这里的文件类型仅表示常规文件和simlink,而不是pdf,jpg,htm,txt等类型吗?

108
Tim

有3种“时间戳记”:

  • 访问-上次读取文件的时间
  • 修改-上次修改文件(内容已修改)
  • 更改-文件的最后一次元数据更改(例如权限)

要显示此信息,您可以使用 stat ,它是coreutils的一部分。

stat还会向您显示更多信息,例如设备,索引节点,链接等。

请记住,这类信息在很大程度上取决于文件系统和安装选项。例如,如果使用noatime选项安装分区,则不会写入任何访问信息。

更改时间戳的实用程序为touch。有一些参数可以决定更改哪个时间戳(例如,-a表示访问时间,-m表示修改时间)并影响新给定时间戳的解析。有关更多详细信息,请参见 man touch

touchcp -u“仅当SOURCE文件比目标文件新或缺少目标文件时,才可以复制”)或用于创建空标记文件。

146
echox

Echox的答案是有效的,但我想添加有关文件创建时间的信息。

文件系统支持

某些文件系统支持索引节点中有关创建时间(或出生时间)的其他条目。我知道 ext4支持此功能 以及 JFS和BTRFS

但是,大多数工具和API尚未更新以读取此额外信息。因此,即使它可能存在,也无法访问。

例如,在Ubuntu 12.04 LTS上,我今天创建的文件得到以下内容:

$ echo Just another test > /tmp/mytest
$ sleep 3
$ touch /tmp/mytest
$ sleep 2
$ cat /tmp/mytest > /dev/null
$ stat /tmp/mytest 
[...]
Access: 2012-06-05 13:33:44.279774711 +0200
Modify: 2012-06-05 13:33:34.611893317 +0200
Change: 2012-06-05 13:33:34.611893317 +0200
 Birth: -
$ Sudo debugfs -R 'stat /tmp/mytest' /dev/sda1
[...]
 ctime: 0x4fcdee8e:91e30114 -- Tue Jun  5 13:33:34 2012
 atime: 0x4fcdee98:42b417dc -- Tue Jun  5 13:33:44 2012
 mtime: 0x4fcdee8e:91e30114 -- Tue Jun  5 13:33:34 2012
crtime: 0x4fcdee46:01258f1c -- Tue Jun  5 13:32:22 2012
[...]

您可以看到较新的stat函数具有一个birth字段,尽管输出似乎不正确。并且通过debugfs我们可以获得信息(crtime,因为我在ext4文件系统上)。

statx支持

现在有了 自从内核4.11开始新的statx系统调用 ,除了更好地支持Y2038或网络文件系统之外,它还带来了一些额外的功能,例如btime或生日(创建时间)访问权限。对ext4的支持应该在同一内核版本4.11中。

在以后的内核版本中,已经有一些补丁程序可以增加对这个新syscall的支持:内核4.13中的BTRFS和F2FS,4.14中的SMB3、4.15中的GFS2、4.16中的NFS等.

即将到来的glibc将提供函数调用以查询此接口(请参阅 有关glibc statx支持的Phoenix新闻 )。因此,我们可以期待很快就会在用户空间中支持此功能。

38
Huygens