文件时间戳——Linux 中的 mtime、ctime 和 atime
时间戳是对文件执行操作的时间记录。时间戳很有用,因为它可以记录访问、修改或添加文件的时间。 Linux 的文件有 3 个由计算机记录的时间戳:
- 访问时间戳(atime):表示上次访问文件的时间。
- 修改时间戳(mtime):这是文件内容最后一次被修改的时间。
- 更改时间戳(ctime):指的是与文件相关的某些元数据上次更改的时间。
在 Linux 中,时间戳实际上存储为秒数而不是日期和时间。这个秒数是指从 1970 年 1 月 1 日 00:00:00 开始的时间量,也就是 Unix Epoch 的时间。但是,当用户想要显示时间戳时,Linux 会将其转换为人类可读的格式,因此将其显示为日期和时间。用户可以使用 ls 命令或 stat 命令查看时间戳。
时间:
修改时间戳 (mtime) 表示上次修改文件内容的时间。例如,如果在文件中添加、删除或替换了新内容,则修改后的时间戳会更改。要查看修改后的时间戳,我们可以简单地使用带有 -l 选项的 ls 命令。
Syntax:
ls -l [filename]
时间:
与 mtime 只与文件内部的内容相关,不同的时间戳表示文件的某些元数据上次更改的时间。例如,如果修改了文件的权限设置,则 mtime 会指示它。要查看更改的时间戳,我们可以在 ls 命令中使用 -lc 选项,如下所示:
Syntax:
ls -lc [filename]
时间:
访问时间戳 (atime) 是指用户上次读取文件的时间。即,用户使用任何合适的程序显示文件的内容,但不必修改任何内容。要使用 ls 命令查看访问时间戳,我们使用 -lu 选项后跟文件名。
Syntax:
ls -lu [filename]
统计命令:
stat 命令可用于同时查看文件的所有时间戳。
Syntax:
stat [filename]
比较表
下表总结了我们提到的三个时间戳之间的区别: File Contents are Modified Metadata is Modified File Accessed without Modification Command to Use mtime Changes No change No change ls -l or stat ctime Changes Changes No change ls -cl or stat atime Changes No change Changes ls -ul or stat
为了进一步解释这个概念,我们将检查一个名为 test.txt 的文件,对该文件进行了以下更改:
创建文件
该文件是在 25/03/2021 的 14:04 使用 nano 命令创建的。我们还可以使用 touch 命令或任何文本编辑器。最初,我们在文件中添加了 1 行
创建文件的命令:
nano test.txt
最初,时间戳都显示创建文件的时间。下图显示了使用 stat 命令查看 3 个时间戳的示例。在此图像中,显示了显示文件创建时间的初始时间戳。每个时间戳右侧的数字 +004 称为时区偏移量,表示时区比 UTC 早 +004 小时。显示给用户时,显示的日期和时间会从 UTC 转换为本地时区。我们还可以注意到 stat 命令在显示时间戳中的秒数方面非常准确。
命令:
stat test.txt
或者,可以使用 ls 命令单独查看每个时间戳,如下所示:
命令:
mtime: ls -l test.txt
ctime: ls -cl test.txt
atime: ls -ul test.txt
在以下步骤中,我们将对文件进行一些更改,并使用 stat 命令观察时间戳的变化。 ls 命令也可以使用。
修改文件
2021 年 3 月 25 日 14:22 使用 nano 文本编辑器(可以使用任何文本编辑器)访问该文件并在其中添加了一个新行。
命令:
nano test.txt
使用 stat 命令,我们可以看到所有 3 个时间戳都更改为 14:22。
命令:
stat test.txt
更改元数据
该文件的权限已于 2021 年 3 月 25 日 14:36 使用 chmod 命令更改。
命令:
chmod 777 test.txt
我们注意到,更改权限后,ctime 和 atime 都更改为 14:36。 mtime 不是这种情况,因为它只在文件内的内容被修改时才会改变。因此,mtime 仍然是 14:22。
命令:
stat test.txt
打开文件而不进行更改
该文件已在 nano 文本编辑器中打开,但在 2021 年 3 月 25 日 14:55 未进行任何更改。
命令:
nano test.txt
从 stat 命令的输出中,我们可以观察到,唯一更改为 14:55 的时间戳是访问时间戳。这是因为没有更改数据。因此,ctime 保持在 14:36,而 mtime 保持在 14:22。
命令:
stat test.txt