本教程解释了 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
标志用于显示上次更改文件元数据或文件属性的时间。
查看访问时间 (atime) 时间戳 ls -lu
命令:
$ ls -lu ostechnix.txt -rw-rw-r-- 1 sk sk 21 Nov 11 17:31 ostechnix.txt
在这里, u
标志显示上次访问文件的时间。
使用以下命令更改 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。 例如,我要分配 可执行权限 到 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
命令。 希望这可以帮助。
atimectimeLinuxLinux basicsLinux 命令mtimeTimestamps