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


105

我只是知道这一点ls -tls -f并在目录下提供不同的文件和子目录排序。

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

例如,我看到有人写道:

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

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


Answers:


138

有3种“时间戳记”:

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

要显示此信息,您可以使用statcoreutils的一部分。

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

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

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

touch可以与cp -u“仅当SOURCE文件比目标文件更新或当目标文件丢失时复制”)或用于创建空标记文件结合使用。


1
谢谢!对于rsync命令,在“它不在乎哪个文件是较新的”中,用“较新的”表示哪种时间戳。另外,顺便说一句,rsync关心的文件类型是否仅意味着常规文件和simlink,而不是pdf,jpg,htm,txt等类型?
蒂姆(Tim)2010年

2
通常,对文件时间的引用是“修改的”时间戳。例如,您从中看到的内容ls -l。文件类型是指文件与符号链接(或其他类型的文件,如目录或设备)。 不是文件中的数据类型是什么(文本与jpeg等)。
赛斯L

2
@Tim在这种情况下是修改后的时间戳;rsync表示,在决定是否应备份文件时,它不会检查源文件是否比现有备份(在备份程序中很常见)修改的时间最近;它只是检查文件是否具有不同的大小或不同的修改时间,如果是,则进行备份
Michael Mrozek

1
我怎么知道什么时候第一次创建文件?此信息是完全保留在某个地方还是在更新中丢失了?可以这么说,该文件存在多长时间了?
xyz

1
统计(2)手册页详细描述了当那些时间戳改变。
Cristian Ciupitu 2014年

35

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以来,除了更好地支持Y2038或网络文件系统外,还存在一个新的statx系统调用,它还带来了一些额外的功能,例如访问btime或出生时间(创建时间)。对ext4的支持应该在同一内核版本4.11中。

在以后的内核版本中,已经有一些补丁程序可以增加对该新系统调用的支持:例如,内核4.13中的BTRFS和F2FS,4.14中的SMB3、4.15中的GFS2、4.16中的NFS等。

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


您是否知道将Windows中的文件(创建时间)移至ext4时,btime是否保持不变(反之亦然),例如mtime?
paradroid

@paradroid很抱歉,我不知道答案。如果在Linux下将文件从NTFS复制到ext4的意思是,如果它支持创建时间,则需要查看NTFS驱动程序。如果要在Windows下使用,则需要查看Windows的ext4驱动程序。
惠更斯
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.