用例子解释 Linux 文件时间戳

本教程解释了 Linux 文件时间戳的类型以及如何使用 touch 命令与示例。

内容

  1. Linux文件时间戳简介
  2. 使用 stat 和 ls 命令查看 Linux 文件时间戳
  3. 使用 touch 命令更改 Linux 文件时间戳
    1. 通过查看或访问或修改文件来更改文件时间戳
    2. 更改符号链接时间戳
    3. [Bonus Tip] 从另一个文件复制时间戳
      1. 结论

Linux文件时间戳简介

通常在 Linux 和 Unix 中,每个文件都有三种类型的时间戳,即 时间 (访问时间), 时间 (修改时间)和 时间 (改变时间)。 顾名思义,时间戳用于确定文件何时被访问、修改和更改。

访问时间(或简称 atime)时间戳是最后一次读取文件的时间。 例如,您可能打开了该文件。 该文件可能已被某个其他程序或远程机器访问过。 您可能已经使用命令(例如 cat 命令)或程序(例如 gedit、vim 等)。 该文件既未编辑也未修改。 只有您或其他用户从远程系统访问过它。

修改时间(或 mtime)时间戳表示上次修改文件(或目录)的时间。 换句话说,mtime 表示文件内容被更改的时间。 例如,您可能在文件中添加了某些内容或从文件中删除了某些内容,或者可能修改了文件的内容。

更改时间(或 ctime)时间戳显示上次更改文件内容或文件元数据(即文件属性,例如文件所有权、文件权限或组)的时间。

总之,

  • atime – 表示上次的时间 使用权 文件以读取内容。
  • mtime – 表示上次的时间 修改 到文件内容。
  • ctime – 表示上次的时间 改变 到文件内容或文件元数据(所有者、组或权限)。

时间戳在各种情况下都有帮助。 以下是时间戳的一些用例:

  • 根据访问或修改时间查找和排序文件。
  • 查找并删除超过 X 天的文件。 用于清理硬盘驱动器中的旧文件。
  • 检查何时更改了配置文件。
  • 验证文件是否被访问。
  • 验证目录是否已更新。
  • 查找早于或晚于 X 天的文件。

查看 Linux 文件时间戳 statls 命令

我们可以使用 Linux 查看文件时间戳 stat 命令。 根据手册页, stat 命令显示 Linux 中的文件或文件系统状态。 stat 命令是 GNU Coreutils,所以我们不用费心安装它。

现在,让我们检查一个名为的文本文件的时间戳 ostechnix.txt 使用 stat 命令:

$ stat ostechnix.txt

示例输出:

  File: ostechnix.txt   Size: 21        	Blocks: 8          IO Block: 4096   regular file Device: 801h/2049d	Inode: 4351679     Links: 1 Access: (0664/-rw-rw-r--)  Uid: ( 1000/      sk)   Gid: ( 1000/      sk) Access: 2020-11-11 17:31:01.484504149 +0530 Modify: 2020-11-11 17:31:01.484504149 +0530 Change: 2020-11-11 17:31:01.484504149 +0530  Birth: -
使用 stat 命令查看 Linux 文件时间戳

上面输出中的最后三行分别显示了访问时间、修改时间和更改时间时间戳。 当我们刚刚创建一个新文件时,所有时间戳都是相同的。

你注意到线了吗?Birth:” 在输出的末尾?表示文件创建的时间戳。POSIX 标准没有定义文件创建的时间戳。一些文件系统(例如 ext4、JFS、Btrfs)存储这个值,但目前没有 Linux 内核 API访问它。因此,我们在“出生:”行中看到一个连字符“-”而不是时间戳。

您还可以使用分别获取 atime、mtime 和 ctime 时间戳 ls 命令。

要查看修改时间(mtime)时间戳,请使用 ls -l 命令:

$ ls -l ostechnix.txt  -rw-rw-r-- 1 sk sk 21 Nov 11 17:31 ostechnix.txt

要查看更改时间 (ctime) 时间戳,请运行 ls -lc 命令:

$ ls -lc ostechnix.txt  -rw-rw-r-- 1 sk sk 21 Nov 11 17:31 ostechnix.txt

在这里, c 标志用于显示上次更改文件元数据或文件属性的时间。

查看访问时间 (atime) 时间戳 ls -lu 命令:

$ ls -lu ostechnix.txt  -rw-rw-r-- 1 sk sk 21 Nov 11 17:31 ostechnix.txt

在这里, u 标志显示上次访问文件的时间。

使用 ls 命令查看 Linux 文件时间戳

使用以下命令更改 Linux 文件时间戳 touch 命令

touch 命令用于在 Linux 中更改文件时间戳以及创建新的空文件。 就像 stat 命令,该 touch 命令也是的一部分 GNU coreutils,所以你也不需要安装它。

在更改时间戳之前,让我们获取名为的文件的当前时间戳 ostechnix.txt 以供参考:

$ stat ostechnix.txt    File: ostechnix.txt   Size: 21        	Blocks: 8          IO Block: 4096   regular file Device: 801h/2049d	Inode: 4351679     Links: 1 Access: (0664/-rw-rw-r--)  Uid: ( 1000/      sk)   Gid: ( 1000/      sk) Access: 2020-11-11 17:31:01.484504149 +0530 Modify: 2020-11-11 17:31:01.484504149 +0530 Change: 2020-11-11 17:31:01.484504149 +0530  Birth: -

正如你在上面的输出中看到的,文件 ostechnix.txt 被访问。 在同一日期和时间即 2020 年 11 月 11 日 17:31:01 修改和更改。

让我们使用以下方法更改此文件的时间戳 touch 命令如下:

$ touch ostechnix.txt

上述命令会将所有时间戳(即 atime、mtime 和 ctime)更改为您计算机的当前时间。

现在让我们看看文件的时间戳 stat 命令:

$ stat ostechnix.txt    File: ostechnix.txt   Size: 21        	Blocks: 8          IO Block: 4096   regular file Device: 801h/2049d	Inode: 4351679     Links: 1 Access: (0664/-rw-rw-r--)  Uid: ( 1000/      sk)   Gid: ( 1000/      sk) Access: 2020-11-11 17:39:59.430610787 +0530 Modify: 2020-11-11 17:39:59.430610787 +0530 Change: 2020-11-11 17:39:59.430610787 +0530  Birth: -
使用 touch 命令更改 Linux 文件时间戳使用 touch 命令更改 Linux 文件时间戳

看? 所有时间戳都已更改为我系统的当前时间,即 2020-11-10 17:51:02.

也可以单独更改单个时间戳。 例如,您可以仅更改访问时间 (atime) 时间戳 -a 旗帜:

$ touch -a ostechnix.txt

上述命令将访问时间时间戳设置为当前时间。

现在,检查时间戳 ostechnix.txt 文件与 stat 命令:

$ stat ostechnix.txt    File: ostechnix.txt   Size: 21        	Blocks: 8          IO Block: 4096   regular file Device: 801h/2049d	Inode: 4351679     Links: 1 Access: (0664/-rw-rw-r--)  Uid: ( 1000/      sk)   Gid: ( 1000/      sk) Access: 2020-11-11 17:43:46.555428706 +0530 Modify: 2020-11-11 17:39:59.430610787 +0530 Change: 2020-11-11 17:43:46.555428706 +0530  Birth: -
仅使用 touch 命令更改访问时间时间戳仅使用 touch 命令更改访问时间时间戳

正如您在上面的输出中看到的,访问时间更改为当前时间。 更改时间也会更新。

要仅更改修改时间时间戳 (mtime),请使用 -m 旗帜:

$ touch -m ostechnix.txt

验证 mtime 是否已更改 stat 命令:

$ stat ostechnix.txt    File: ostechnix.txt   Size: 21        	Blocks: 8          IO Block: 4096   regular file Device: 801h/2049d	Inode: 4351679     Links: 1 Access: (0664/-rw-rw-r--)  Uid: ( 1000/      sk)   Gid: ( 1000/      sk) Access: 2020-11-11 17:43:46.555428706 +0530 Modify: 2020-11-11 17:47:17.577722187 +0530 Change: 2020-11-11 17:47:17.577722187 +0530  Birth: -
仅使用 touch 命令更改修改时间时间戳仅使用 touch 命令更改修改时间时间戳

现在 mtime 和 ctime 时间戳发生了变化,而 atime 保持原样。

您可能已经注意到,当我们更改访问时间或修改时间时,ctime 也会更新。

如果要同时更改 atime 和 mtime 时间戳,请使用 -d 选项。

$ touch -d "2020-11-11 17:50:01" ostechnix.txt

验证 atime 和 mtime 时间戳是否已更改 stat 命令:

$ stat ostechnix.txt    File: ostechnix.txt   Size: 21        	Blocks: 8          IO Block: 4096   regular file Device: 801h/2049d	Inode: 4351679     Links: 1 Access: (0664/-rw-rw-r--)  Uid: ( 1000/      sk)   Gid: ( 1000/      sk) Access: 2020-11-11 17:50:01.000000000 +0530 Modify: 2020-11-11 17:50:01.000000000 +0530 Change: 2020-11-11 17:51:17.024213698 +0530  Birth: -
使用 touch 命令同时更改 atime 和 mtime 时间戳使用 touch 命令同时更改 atime 和 mtime 时间戳

我们现在已经将访问时间和修改时间设置为特定时间即 2020-11-11 17:50:01. 并且 ctime 时间戳也更新为当前时间。

也可以使用特定的时间戳而不是当前时间 -t 标志也是:

$ touch -t 2011111754 ostechnix.txt

此命令会将 atime 和 mtime 时间戳设置为 2020-11-11 17:54:00. 验证它 stat 命令如下:

$ stat ostechnix.txt    File: ostechnix.txt   Size: 21        	Blocks: 8          IO Block: 4096   regular file Device: 801h/2049d	Inode: 4351679     Links: 1 Access: (0664/-rw-rw-r--)  Uid: ( 1000/      sk)   Gid: ( 1000/      sk) Access: 2020-11-11 17:54:00.000000000 +0530 Modify: 2020-11-11 17:54:00.000000000 +0530 Change: 2020-11-11 17:56:20.844405239 +0530  Birth: -

如前所述,当 atime 和 mtime 更改时,ctime 会更新。 如果只想更改 ctime 时间戳,则没有专用标志 touch 命令。 所以需要通过修改文件元数据或文件属性来手动更改ctime。 例如,我要分配 可执行权限ostchnix.txt 文件与 chmod 命令:

$ chmod +x ostechnix.txt

检查 ctime 是否得到更新 stat 命令:

$ stat ostechnix.txt    File: ostechnix.txt   Size: 21        	Blocks: 8          IO Block: 4096   regular file Device: 801h/2049d	Inode: 4351679     Links: 1 Access: (0775/-rwxrwxr-x)  Uid: ( 1000/      sk)   Gid: ( 1000/      sk) Access: 2020-11-11 17:54:00.000000000 +0530 Modify: 2020-11-11 17:54:00.000000000 +0530 Change: 2020-11-11 17:57:21.022720776 +0530  Birth: -
仅使用 touch 命令更改更改时间时间戳仅使用 touch 命令更改更改时间时间戳

看? ctime 时间戳已更改,但 atime 和 mtime 时间未更改。 因为文件既没有被访问也没有被改变。 我只更改了文件权限。

通过查看或访问或修改文件来更改文件时间戳

如前所述,当我们访问文件进行读取时,atime 时间戳会发生变化。 尝试访问文件以使用 cat 命令,看看会发生什么。

$ cat ostechnix.txt This is a text file.

现在检查访问时间时间戳是否更新:

$ stat ostechnix.txt    File: ostechnix.txt   Size: 21        	Blocks: 8          IO Block: 4096   regular file Device: 801h/2049d	Inode: 4351679     Links: 1 Access: (0775/-rwxrwxr-x)  Uid: ( 1000/      sk)   Gid: ( 1000/      sk) Access: 2020-11-11 18:00:16.005323521 +0530 Modify: 2020-11-11 17:54:00.000000000 +0530 Change: 2020-11-11 17:57:21.022720776 +0530  Birth: -

看? atime 值现在已更改。

当我们从文件中添加或删除数据时,mtime 会更新。

让我在 ostechnix.txt 文件:

$ echo "modify this file" >> ostechnix.txt

检查文件时间戳:

$ stat ostechnix.txt    File: ostechnix.txt   Size: 38        	Blocks: 8          IO Block: 4096   regular file Device: 801h/2049d	Inode: 4351679     Links: 1 Access: (0775/-rwxrwxr-x)  Uid: ( 1000/      sk)   Gid: ( 1000/      sk) Access: 2020-11-11 18:00:16.005323521 +0530 Modify: 2020-11-11 18:01:49.072771458 +0530 Change: 2020-11-11 18:01:49.072771458 +0530  Birth: -

由于文件的内容发生了变化,它的 mtime 和 ctime 都发生了变化。

默认情况下,如果您使用 touch 命令 符号链接 (或符号链接),它也会更改引用文件的时间戳。

如果您只想更改符号链接的时间戳,请使用 -h, (--no-dereference) 选项:

$ touch -h <path-to-symlink>

[Bonus Tip] 从另一个文件复制时间戳

touch 命令有一个选项叫做 -r, (--reference=) 它允许您将时间戳从一个文件复制到另一个文件。

以下命令将把 file1 的时间戳复制到 file2。

$ touch -r file1.txt file2.txt

有关更多详细信息,请参阅手册页 stattouch 命令:

$ man stat
$ man touch

结论

在本指南中,我们讨论了三种类型的 Linux 文件时间戳,即 atime、mtime 和 ctime,如何使用 statls 命令以及最后如何更改这些文件时间戳 touch 命令。 希望这可以帮助。

atimectimeLinuxLinux basicsLinux 命令mtimeTimestamps