本教程解释了 Linux 文件时间戳的类型以及如何使用查看和更改文件的时间戳 touch
命令与示例。
Linux文件时间戳简介
通常在 Linux 和 Unix 中,每个文件都有三种类型的时间戳,即 一次 (访问时间), 时间 (修改时间)和 时间 (更改时间)。 顾名思义,时间戳用于找出文件何时被访问、修改和更改。
访问时间(或简称为 atime)时间戳是最后一次读取文件的时间。 例如,您可能已经打开了该文件。 该文件可能已被其他程序或远程计算机访问。 您可能已经使用命令读取了文件的内容(例如 cat
命令)或程序(例如 gedit、vim 等)。 该文件既没有编辑也没有修改。 只有您或其他用户从远程系统访问过它。
修改时间(或 mtime)时间戳表示上次修改文件(或目录)的时间。 换句话说,mtime 表示文件内容被更改的时间。 例如,您可能在文件中添加了某些内容或从文件中删除了某些内容,或者可能已经修改了文件的内容。
更改时间(或 ctime)时间戳显示上次更改文件内容或文件元数据(即文件属性,例如文件所有权、文件权限或组)的时间。
总之,
- atime – 表示最后的时间 使用权 归档以读取内容。
- mtime – 表示上次的时间 修改 到文件内容。
- ctime – 表示最后的时间 改变 文件内容或文件元数据(所有者、组或权限)。
时间戳在各种情况下都有帮助。 以下是时间戳的一些用例:
- 根据访问或修改时间查找和排序文件。
- 查找并删除超过 X 天的文件。 用于清理硬盘驱动器中的旧文件。
- 检查配置文件何时更改。
- 验证是否访问了文件。
- 验证目录是否已更新。
- 查找早于或晚于 X 天的文件。
查看 Linux 文件时间戳 stat
和 ls
命令
我们可以使用 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: -
上面输出的最后三行分别显示了访问时间、修改时间和更改时间时间戳。 当我们刚刚创建一个新文件时,所有时间戳都是相同的。
你注意到线“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
flag 用于显示上次更改文件元数据或文件属性的时间。
查看访问时间(atime)时间戳 ls -lu
命令:
$ ls -lu ostechnix.txt
-rw-rw-r-- 1 sk sk 21 Nov 11 17:31 ostechnix.txt
在这里, u
flag 显示上次访问文件的时间。
更改 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: -

看? 所有时间戳都已更改为我系统的当前时间,即 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: -

正如您在上面的输出中看到的,访问时间更改为当前时间。 更改时间也会更新。
要仅更改修改时间时间戳 (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: -

现在 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: -

我们现在已经将访问时间和修改时间设置为特定时间,即 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。 为了 example我要分配 可执行权限 到 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: -

看? 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
有关详细信息,请参阅手册页 stat
和 touch
命令:
$ man stat
$ man touch
结论
在本指南中,我们讨论了三种类型的 Linux 文件时间戳,即 atime、mtime 和 ctime,如何使用 stat
和 ls
命令,最后如何更改这些文件时间戳 touch
命令。 希望这可以帮助。