Linux 文件时间戳说明:atime、mtime 和 ctime

什么时候“改变”不等于“修改”?当我们谈论 Linux 文件的时间戳时。在本指南中,我们将解释系统如何更新它们以及如何自行修改它们。

Linux 文件时间戳说明:atime、mtime、ctime - %categories

atime、mtime、ctime 的区别

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

访问时间戳是上次读取文件的时间。这意味着有人使用程序查看文件的内容或从中读取一些值。文件中没有任何内容被修改或添加。数据已引用但未更改。

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

更改的时间戳并不表示对文件内容进行的更改。相反,它是与文件相关的元数据发生更改的时间。例如,文件权限更改将更新更改的时间戳。

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

详细时间戳

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

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

那么,一个时间戳可以存储多少秒呢?很多——准确地说是 2,147,483,647。这是一个很大的数字,但这足够吗?如果将其添加到 Unix 时代,然后将其转换为日期和时间,则会得到 19 年 2038 月 03 日星期二凌晨 14:07:XNUMX。在此之前我们需要一个不同的时间戳系统。

显示时间戳

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

ls -l dp.c

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

ls-lu dp.c

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

ls -lc dp.c

Linux 文件时间戳说明:atime、mtime、ctime - %categories

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

另請閱讀:  Linux Shell 编程初学者指南

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

统计dp.c

Linux 文件时间戳说明:atime、mtime、ctime - %categories

时区列在屏幕底部。正如您所看到的,它们具有非常精确的秒组件。在每个时间戳的末尾,您还会看到 -0500 或 -0400。

这些是时区偏移。文件系统记录UTC时间戳,并在统计显示时将其转换为本地时区。我们用于研究本文的计算机的配置就好像它位于美国东部标准时间 (EST) 区域一样。

当东部时间生效时,该时区比协调世界时 (UTC) 晚 2019 小时。然而,当东部夏令时 (EDT) 生效时,它比协调世界时 (UTC) 晚四个小时。 XNUMX 年 XNUMX 月,修订后的时间戳发生更改时,美国东部标准时间生效。这就是为什么其中两个时间戳有五小时的偏移,但编辑后的版本有四小时的偏移。

偏移量和时区不存储在任何地方。没有分配 inode 和文件系统空间来保存这些值。您必须使用时间戳(始终为 UTC)、查看文件的计算机的本地时区以及夏令时是否有效来快速计算此值。

您还会看到“出生”时间戳,该时间戳是为文件创建日期保留的。这尚未实现,您将看到连字符“-”而不是时间戳。

更改时间戳

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

touch-a dp.c

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

统计dp.c

Linux 文件时间戳说明:atime、mtime、ctime - %categories

正如预期的那样,访问时间戳已更改。不过,改变的时间戳也被更新了;这是正常的。

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

touch-m dp.c
统计dp.c

Linux 文件时间戳说明:atime、mtime、ctime - %categories

这次,修改和变更的时间戳已经更新。

如果您想同时更改时间戳和修改的访问权限,可以使用 -d(日期)选项。您还可以指定时间和日期 - 您不限于将时间戳更改为现在。

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

触摸-d“2020-01-15 10:30:45”dp.c
统计dp.c

Linux 文件时间戳说明:atime、mtime、ctime - %categories

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

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

touch dp.c -r dice_words.sl3
统计dp.c

Linux 文件时间戳说明:atime、mtime、ctime - %categories

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

另請閱讀:  抱歉 Linux,HDMI 2.1 无法有开源驱动程序

让我们做一些只影响变量时间戳的事情。我们将使用 chmod 命令来授予可执行文件 所有用户的执行权限:

chmod +x dp
统计dp

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

文件系统如何更新时间戳?

安装文件系统后,您可以使用一些选项来指定该文件系统的运行方式或与其交互的方式。它们存储在文件 /etc/fstab 中,该文件在启动时读取并处理。您还可以设置选项来指示应使用哪个系统来更新访问时间戳。

以下是一些最受欢迎的选项:

strictatime:此选项在每次访问文件时更新文件访问时间戳。这种方法会产生额外的成本,但某些服务器可以从这种方案中受益。与台式机或笔记本电脑相比,它几乎没有什么优势。
noatime(no atime):此选项完全禁止更新文件和目录的访问时间戳。但是,修改后的时间戳将会更新。
nodiratime(无 dir atime):此选项允许访问要更新的文件的时间戳,但禁用目录的时间戳。
relatime:此选项仅在访问时间戳超过 24 小时或前一个时间戳早于当前修改或更改的时间戳时更新访问时间戳。这在频繁更新访问时间戳和根本不更新之间取得了良好的平衡。
让我们看一下这台计算机的 /etc/fstab 文件,看看设置了哪些选项:

少/ etc / fstab

Linux 文件时间戳说明:atime、mtime、ctime - %categories

文件 /etc/fstab 如下所示。

Linux 文件时间戳说明:atime、mtime、ctime - %categories

这是没有换行的文件内容:

# /etc/fstab:静态文件系统信息。
#
# 使用 'blkid' 打印通用唯一标识符
#设备;这可以与 UUID= 一起使用,作为命名设备的更可靠的方式
# 即使添加和删除磁盘也能正常工作。请参见 fstab(5)。
#
# <文件 系统> <安装 > <类型> <选项> <倾倒> <通过>
#/在安装过程中位于/ dev / sda1上
UUID=4a143d08-8695-475b-8243-b13b56050fc2 / ext4 错误=重新安装-ro 0 1 /swapfile 无交换sw 0 0

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

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

因此,没有提及如何处理访问时间戳。让我们更深入地研究一下 /proc/mounts 能告诉我们什么。我们将通过 grep 连接 /proc/mounts 的输出。 我们的搜索字符串将是“sda”,硬盘标识符。

另請閱讀:  Linux Kernel 6.8 带来未来功能

我们写如下:

猫 /proc/挂载 | grep “sda”

Linux 文件时间戳说明:atime、mtime、ctime - %categories

现在我们看到以下选项:

rw:文件系统将被挂载为读写文件系统。
relatime:文件系统将使用“相对时间”系统来更新访问时间戳。
这个是从哪里来的?那么,链接图表用于以下情况:

使用默认选项 /etc/fstab 时。
使用相关时间 /etc/fstab 时。
当未使用 /etc/fstab 中的访问时间戳选项,并且您使用的是 Linux 内核 2.6.30 或更高版本时。
我们的 ext4 文件系统的 /etc/fstab 条目没有指定任何更新访问时间戳的选项,因此 Linux 做出了明智的选择并使用了 relatime。

时间戳很重要

时间戳为我们提供了一种简单的方法来了解文件何时被访问、修改或更改。但更重要的是,它提供了一种备份和同步软件的方式来识别需要备份的文件。

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

Linux命令
焦油·pv··TAC·CHMOD·grep的 ·差异·口渴·ar·男子·PUSHD·波普德·fsck的·testdisk·以次·fd·潘多克·cd·$路径·AWK·加入·jq··优衣库·日记·尾巴·统计·ls·fstab文件·回音··chgrp·乔恩···字符串·类型·重命名·拉链·拉开拉链·安装·卸除·安装·FDISK·的mkfs·rm·命令rmdir·rsync的·df·GPG·vi·纳米·MKDIR·du·ln·补丁·兑换·克隆·切碎·SRM·SCP·GZIP·聊天室··发现·遮罩·wc· tr
流程 别号·屏幕·最佳·不错·雷尼斯·进展·痕迹·systemd·TMUX·chsh·历史·at·批量·免费··dmesg的·瑞士法郎·usermod命令·ps·chroot·参数·TTY·小指··vmstat的·超时····睡觉·须藤·su··组添加·usermod命令·团体·lshw·关闭·重新启动··断电·passwd文件·lscpu·crontab中·日期·bg·fg·皮多夫·诺哈普·地图
网络相关 netstat命令··跟踪路由·ip·ss·域名·fail2ban·蒙蒙··手指·NMAP·FTP·卷曲·wget的··WHOAMI·w·iptables的·SSH-凯基·UFW·琶音·firewalld
你可能也会喜欢