Linux 文件时间戳解释:atime、mtime 和 ctime

什么时候“改变”不意味着“修改”? 当我们谈论 Linux 文件时间戳时。 在本指南中,我们将解释系统怎样更新它们,以及怎样自己更改它们。

atime、mtime 和 ctime 之间的区别

每个 Linux 文件都有三个 时间戳: 访问时间戳 (atime)、修改时间戳 (mtime) 和更改时间戳 (ctime)。

访问时间戳是上次读取文件的时间。 这意味着有人使用程序来显示文件的内容或从中读取一些值。 没有对文件进行任何编辑或添加。 数据被引用但没有改变。

修改的时间戳表示上次修改文件内容的时间。 程序或进程编辑或操作了文件。 “修改”是指文件中的某些内容被修改或删除,或添加了新数据。

更改的时间戳不是指对文件内容所做的更改。 相反,它是与文件相关的元数据发生更改的时间。 文件权限更改,对于 example, 将更新更改的时间戳。

标准的 ext4 Linux 文件系统还在其内部文件系统结构中为文件创建时间戳分配空间,但这尚未实现。 有时,会填充此时间戳,但您不能依赖其中的值。

时间戳剖析

Linux 时间戳包含一个数字而不是日期和时间。 这个数字是自 Unix时代,即 1970 年 1 月 1 日午夜 (00:00:00),在 协调世界时 (UTC). 闰秒在 Linux 时间戳中被忽略,因此它们与实时时间不同。


当 Linux 需要显示时间戳时,它会将秒数转换为日期和时间。 这使人类更容易理解。 查看文件的计算机所在的位置和时区指导将秒数转换为日期和时间。 它还确保月份使用正确的语言。

那么,一个时间戳可以存储多少秒? 很多——准确地说是 2,147,483,647。 这是一个很大的数字,但这足够了吗? 如果您将其添加到 Unix 纪元,然后将其转换为日期和时间,您将得到 2038 年 1 月 19 日,星期二,上午 03:14:07,但在那之前,我们需要一个不同的时间戳方案。

查看时间戳

当您使用 -l (长列表)选项与 ls, 如下所示, 你可以看到修改后的时间戳

ls -l dp.c

如果要查看访问时间戳,请使用 -lu (访问时间)选项如下:

ls -lu dp.c

最后,要查看更改时间戳,您可以使用 -lc (更改时间)选项; 键入以下内容:

ls -lc dp.c


上面的时间戳显示文件的内容最后修改时间是 2019 年 4 月 21 日。访问和更改的时间戳是相同的,因为文件是在 2020 年 1 月 20 日从另一台计算机复制到这台计算机的,并且两个时间戳都在那时更新。

同时查看所有时间戳, 使用 stat 命令如下:

stat dp.c

Linux 文件时间戳解释:atime、mtime 和 ctime 1

时区列在显示屏底部。 如您所见,它们具有非常准确的小数秒部分。 在每个时间戳的末尾,您还会看到 -0500 或者 -0400 .

这些是时区偏移量。 文件系统以UTC格式记录时间戳,并在显示时将其转换为本地时区 stat. 我们用来研究这篇文章的计算机被配置为好像它在美国东部标准时间 (EST) 区

当 EST 生效时,该时区比 UTC 晚五个小时。 但是,当东部夏令时 (EDT) 生效时,它比 UTC 晚四个小时。 2019 年 4 月,当修改后的时间戳更改时,EDT 生效。 这就是为什么两个时间戳有五个小时的偏移量,而修改后的时间戳有四个小时的偏移量。


偏移量和时区不会存储在任何地方。 没有专门用于保存这些值的 inode 和文件系统空间。 您必须使用时间戳(始终采用 UTC 时间)、显示文件的计算机的本地时区以及 DST 是否有效来动态计算这些值。

您还会看到一个“出生”时间戳,它是为文件的创建日期保留的。 这没有实现,你会看到一个连字符“-”而不是时间戳。

你想知道的关于 Linux 上的 inode 的一切

更改时间戳

如果需要,您可以更改文件上的时间戳。 您可以使用 touch 命令更改访问或修改的时间戳, 或两者:

touch -a dp.c

要设置新的访问时间戳,您可以使用 -a (访问时间)选项。 此命令将访问时间戳设置为计算机的当前时间:

stat dp.c

Linux 文件时间戳解释:atime、mtime 和 ctime 2

正如预期的那样,访问时间戳发生了变化。 但是,更改后的时间戳也已更新; 这是正常的。

要更改修改后的时间戳,您可以使用 -m (修改时间)选项:

touch -m dp.c
stat dp.c

Linux 文件时间戳解释:atime、mtime 和 ctime 3

这一次,修改和更改的时间戳被更新。

您可以使用 -d (date) 选项,如果您想同时更改访问和修改的时间戳。 您还可以指定时间和日期——您不仅可以将时间戳更改为当前。


我们将使用以下命令将访问和修改的时间戳设置为 2020 年 1 月 15 日的 10:30:45:

touch -d "2020-01-15 10:30:45" dp.c
stat dp.c

Linux 文件时间戳解释:atime、mtime 和 ctime 4

我们现在已将访问和修改的时间戳设置为过去的日期。 更改的时间戳也更新为计算机的当前时间。

您还可以使用 -r (reference) 选项,如下所示,如果要将一个文件的时间戳设置为另一个文件的时间戳值:

touch dp.c -r dice_words.sl3
stat dp.c

Linux 文件时间戳解释:atime、mtime 和 ctime 5

然后,我们几乎回到了开始的地方,混合了 -0400-0500 时间戳。

让我们做一些只影响改变的时间戳的事情。 我们将使用 chmod 命令给出一个可执行文件 所有用户的执行权限

chmod +x dp
stat dp

Linux 文件时间戳解释:atime、mtime 和 ctime 6

更改的时间戳是唯一更新的时间戳。 这是因为文件本身没有改变——它既没有被访问也没有被修改。 但是,有关文件的元数据已更改。

怎样在 Linux 上使用 chmod 命令

文件系统怎样更新时间戳

挂载文件系统时,您可以使用一些选项来指定该文件系统应怎样操作或被处理。 这些存储在 /etc/fstab 文件,在启动时读取和处理。 您还可以设置选项来规定他们应该用于更新访问时间戳的方案。

以下是一些最常见的选项:

  • 严格的时间 (严格时间):此选项会在每次访问文件时更新文件的访问时间戳。 这种方法会带来额外的开销,但某些服务器可以从这种方案中受益。 它在台式机或笔记本电脑上没有什么价值。
  • 时间 (没有时间): 此选项完全禁止更新文件和目录的访问时间戳。 但是,修改后的时间戳仍会更新。
  • nodiratime(不是 dir atime): 此选项启用要更新的文件的访问时间戳,但禁用目录的访问时间戳。
  • 相对时间(相对时间): 仅当访问时间戳超过 24 小时,或者前一个比当前修改或更改的时间戳更旧时,此选项才会更新访问时间戳。 这在访问时间戳更新过于频繁或根本不更新之间取得了很好的平衡。


让我们来看看 /etc/fstab 此计算机的文件并查看设置了哪些选项:

less /etc/fstab

Linux 文件时间戳解释:atime、mtime 和 ctime 7

/etc/fstab 文件为我们显示,如下所示。

Linux 文件时间戳解释:atime、mtime 和 ctime 8

这是没有环绕的文件内容:

# /etc/fstab: static file system information.
#
# Use 'blkid' to print the universally unique identifier for a
# device; this may be used with UUID= as a more robust way to name devices
# that works even if disks are added and removed. See fstab(5).
#
# <file system> <mount point> <type> <options> <dump> <pass>
# / was on /dev/sda1 during installation
UUID=4a143d08-8695-475b-8243-b13b56050fc2 / ext4 errors=remount-ro 0 1
/swapfile none swap sw 0 0

只有两个条目,其中一个是交换文件,我们可以忽略。 另一个正在安装在文件系统的根目录( / ) 并且在设备上 /dev/sda1 在安装时。 这是第一个硬盘驱动器上的第一个分区,它恰好包含一个 ext4 文件系统。

传递给它的唯一选项是 errors=remount-ro,它告诉操作系统在尝试将该文件系统挂载为读写文件系统时出现错误时将该文件系统重新挂载为只读。

因此,没有提及怎样处理访问时间戳。 让我们深入挖掘,看看是什么 /proc/mounts 可以告诉我们。 我们将从管道输出 /proc/mounts 通过 grep. 我们的搜索字符串将是“sda”,硬盘标识符。

我们键入以下内容:

cat /proc/mounts | grep "sda"

Linux 文件时间戳解释:atime、mtime 和 ctime 9

现在我们看到以下选项:

  • 权重: 文件系统将挂载为读写文件系统。
  • 关联时间:文件系统将使用“相对时间”方案来更新访问时间戳。


那个是从哪里来的? 那么, relatime 方案用于以下情况:

  • 当。。。的时候 默认值 /etc/fstab 选项被使用。
  • 当。。。的时候 关联时间 /etc/fstab 选项被使用。
  • 当没有使用访问时间戳选项时 /etc/fstab,并且您使用的是 Linux 内核 2.6.30 或更新版本。

我们的 /etc/fstab 进入 ext4 文件系统没有指定任何访问时间戳更新选项,因此 Linux 做出了明智的选择并使用了 relatime.

怎样在 Linux 上编写 fstab 文件

时间戳很重要

时间戳为我们提供了一种查看文件何时被访问、修改或更改的简单方法。 但是,更重要的是,它们提供了一种备份和同步软件的方法,以确定需要备份哪些文件。

当您需要强制说服程序包含或忽略一个文件或一组文件时,操作时间戳的能力将被证明是有用的。

相关阅读:

Posted in: Linux