如何在 Linux 中查看文件的修改时间和访问时间

LinuxBeginner
立即练习

简介

在 Linux 操作系统中,每个文件都有与之关联的时间戳,用于记录文件的修改时间、访问时间或属性更改时间。对于需要监控文件活动的系统管理员、开发人员和普通用户来说,了解这些时间戳至关重要。

本教程将指导你掌握在 Linux 中检查文件时间戳的实用技巧。你将学习如何使用不同的命令查看文件的修改时间和访问时间,从而更好地跟踪文件的更改情况并监控 Linux 环境中的文件使用模式。

理解 Linux 中的文件时间戳

在 Linux 中,每个文件都有三个由系统自动维护的重要时间戳:

文件时间戳的类型

  1. 修改时间(Modification Time,mtime):记录文件内容最后一次被修改的时间。
  2. 访问时间(Access Time,atime):记录文件最后一次被读取或访问的时间。
  3. 更改时间(Change Time,ctime):记录文件元数据(权限、所有者)最后一次被更改的时间。

让我们通过创建一个测试文件并检查其属性来开始探索文件时间戳。

首先,打开终端并导航到你的项目目录:

cd ~/project

使用 touch 命令创建一个简单的文本文件:

touch testfile.txt

touch 命令在文件不存在时会创建一个空文件,若文件已存在则会更新其时间戳。

让我们使用带有 -l 选项(长列表格式)的 ls 命令来查看文件的基本信息:

ls -l testfile.txt

你应该会看到类似如下的输出:

-rw-r--r-- 1 labex labex 0 May 15 14:30 testfile.txt

在这个输出中:

  • 第一列显示文件权限
  • 第三列和第四列显示文件所有者和所属组
  • 第五列显示文件大小(0 字节)
  • 日期和时间(此示例中为“May 15 14:30”)显示修改时间
  • 最后一列是文件名

这个基本列表显示了修改时间,但没有显示访问时间或更改时间。我们将在接下来的步骤中探索这些内容。

使用 stat 命令查看所有时间戳

虽然 ls 命令能为我们提供基本的文件信息,但 stat 命令可以提供关于文件的更详细信息,包括全部三个时间戳。

让我们使用 stat 命令来查看测试文件的所有时间戳:

stat testfile.txt

你应该会看到类似如下的输出:

  File: testfile.txt
  Size: 0           Blocks: 0          IO Block: 4096   regular empty file
Device: 801h/2049d  Inode: 2101099     Links: 1
Access: (0644/-rw-r--r--)  Uid: (1000/labex)   Gid: (1000/labex)
Access: 2023-05-15 14:30:00.000000000 +0000
Modify: 2023-05-15 14:30:00.000000000 +0000
Change: 2023-05-15 14:30:00.000000000 +0000
 Birth: -

在这个输出中:

  • Access:显示文件最后一次被访问的时间(atime)
  • Modify:显示文件内容最后一次被修改的时间(mtime)
  • Change:显示文件元数据最后一次被更改的时间(ctime)
  • Birth:显示文件的创建时间(并非所有文件系统都支持)

注意,目前这三个时间戳是相同的,因为我们刚刚创建了这个文件。让我们修改文件,看看这些时间戳会如何变化。

使用 echo 命令向文件中添加一些内容:

echo "This is a test file" > testfile.txt

现在,让我们再次检查时间戳:

stat testfile.txt

你应该会看到修改时间(Modify)和更改时间(Change)已经更新,而访问时间可能保持不变,具体取决于你的系统配置。

  File: testfile.txt
  Size: 19          Blocks: 8          IO Block: 4096   regular file
Device: 801h/2049d  Inode: 2101099     Links: 1
Access: (0644/-rw-r--r--)  Uid: (1000/labex)   Gid: (1000/labex)
Access: 2023-05-15 14:30:00.000000000 +0000
Modify: 2023-05-15 14:35:12.000000000 +0000
Change: 2023-05-15 14:35:12.000000000 +0000
 Birth: -

检查修改时间(mtime)

每当文件内容发生更改时,修改时间(mtime)就会更新。这是文件列表中默认最常显示的时间戳。

使用 ls 命令检查修改时间

标准的 ls -l 命令默认会显示修改时间:

ls -l testfile.txt

输出:

-rw-r--r-- 1 labex labex 19 May 15 14:35 testfile.txt

对于当年修改的文件,ls -l 会显示月份、日期和时间。对于往年修改的文件,它会显示月份、日期和年份,而不是时间。

自定义时间格式

要查看更详细的时间戳信息,可以在 ls 命令中使用 --time-style 选项:

ls -l --time-style=full-iso testfile.txt

输出:

-rw-r--r-- 1 labex labex 19 2023-05-15 14:35:12.000000000 +0000 testfile.txt

这会显示完整的 ISO 格式时间戳,包括年、月、日、时、分、秒和时区。

你还可以使用其他格式选项,如 long-isoiso

ls -l --time-style=long-iso testfile.txt

输出:

-rw-r--r-- 1 labex labex 19 2023-05-15 14:35 testfile.txt

使用 date 命令显示修改时间

另一种检查修改时间的方法是使用 date 命令并搭配 -r 选项:

date -r testfile.txt

输出:

Mon May 15 14:35:12 UTC 2023

此命令会以人类可读的格式显示修改时间。

检查访问时间(atime)

访问时间(atime)会在文件被读取或访问时更新。不过,许多现代 Linux 系统会使用 relatimenoatime 等挂载选项来减少 atime 更新的频率,以提高性能。

使用 ls 命令检查访问时间

若要查看访问时间而非修改时间,可在 ls -l 命令中使用 -u 选项:

ls -lu testfile.txt

输出:

-rw-r--r-- 1 labex labex 19 May 15 14:40 testfile.txt

此时显示的时间戳是访问时间,而非修改时间。

让我们访问该文件以更新其访问时间:

cat testfile.txt

输出:

This is a test file

现在再次检查访问时间:

ls -lu testfile.txt

你应该会看到访问时间已更新为当前时间。

比较所有时间戳

让我们使用 stat 命令查看访问文件后的所有时间戳:

stat testfile.txt

输出:

  File: testfile.txt
  Size: 19          Blocks: 8          IO Block: 4096   regular file
Device: 801h/2049d  Inode: 2101099     Links: 1
Access: (0644/-rw-r--r--)  Uid: (1000/labex)   Gid: (1000/labex)
Access: 2023-05-15 14:41:05.000000000 +0000
Modify: 2023-05-15 14:35:12.000000000 +0000
Change: 2023-05-15 14:35:12.000000000 +0000
 Birth: -

注意,只有访问时间发生了变化,而修改时间和更改时间与之前保持一致。

更改文件权限以更新更改时间

让我们通过修改文件权限来更新更改时间(ctime):

chmod 640 testfile.txt

再次检查所有时间戳:

stat testfile.txt

输出:

  File: testfile.txt
  Size: 19          Blocks: 8          IO Block: 4096   regular file
Device: 801h/2049d  Inode: 2101099     Links: 1
Access: (0640/-rw-r-----)  Uid: (1000/labex)   Gid: (1000/labex)
Access: 2023-05-15 14:41:05.000000000 +0000
Modify: 2023-05-15 14:35:12.000000000 +0000
Change: 2023-05-15 14:42:30.000000000 +0000
 Birth: -

你可以看到,更改时间(ctime)已更新为当前时间,而访问时间和修改时间保持不变。

使用 touch 命令操作文件时间戳

touch 命令不仅可以用于创建文件,还能更新文件的时间戳。这在测试场景或需要同步文件间时间戳时非常有用。

更新所有时间戳

若要将所有时间戳(访问时间、修改时间和更改时间)更新为当前时间,可使用以下命令:

touch testfile.txt

检查时间戳:

stat testfile.txt

输出:

  File: testfile.txt
  Size: 19          Blocks: 8          IO Block: 4096   regular file
Device: 801h/2049d  Inode: 2101099     Links: 1
Access: (0640/-rw-r-----)  Uid: (1000/labex)   Gid: (1000/labex)
Access: 2023-05-15 14:45:10.000000000 +0000
Modify: 2023-05-15 14:45:10.000000000 +0000
Change: 2023-05-15 14:45:10.000000000 +0000
 Birth: -

仅更新访问时间

若要仅更新访问时间,可使用以下命令:

touch -a testfile.txt

检查时间戳:

stat testfile.txt

输出:

  File: testfile.txt
  Size: 19          Blocks: 8          IO Block: 4096   regular file
Device: 801h/2049d  Inode: 2101099     Links: 1
Access: (0640/-rw-r-----)  Uid: (1000/labex)   Gid: (1000/labex)
Access: 2023-05-15 14:46:15.000000000 +0000
Modify: 2023-05-15 14:45:10.000000000 +0000
Change: 2023-05-15 14:46:15.000000000 +0000
 Birth: -

请注意,更改时间(ctime)也会更新,因为文件的元数据发生了变化。

仅更新修改时间

若要仅更新修改时间,可使用以下命令:

touch -m testfile.txt

检查时间戳:

stat testfile.txt

输出:

  File: testfile.txt
  Size: 19          Blocks: 8          IO Block: 4096   regular file
Device: 801h/2049d  Inode: 2101099     Links: 1
Access: (0640/-rw-r-----)  Uid: (1000/labex)   Gid: (1000/labex)
Access: 2023-05-15 14:46:15.000000000 +0000
Modify: 2023-05-15 14:47:20.000000000 +0000
Change: 2023-05-15 14:47:20.000000000 +0000
 Birth: -

同样,更改时间也会更新。

设置特定的时间戳

你可以使用 touch 命令的 -d 选项来设置特定的时间戳:

touch -d "2023-01-01 12:00:00" testfile.txt

检查时间戳:

stat testfile.txt

输出:

  File: testfile.txt
  Size: 19          Blocks: 8          IO Block: 4096   regular file
Device: 801h/2049d  Inode: 2101099     Links: 1
Access: (0640/-rw-r-----)  Uid: (1000/labex)   Gid: (1000/labex)
Access: 2023-01-01 12:00:00.000000000 +0000
Modify: 2023-01-01 12:00:00.000000000 +0000
Change: 2023-05-15 14:48:30.000000000 +0000
 Birth: -

这会将访问时间和修改时间都设置为 2023 年 1 月 1 日下午 12:00。更改时间仍会更新为当前时间。

根据现有文件的时间戳创建新文件

你还可以使用 -r 选项来引用另一个文件的时间戳:

## Create a new file
touch newfile.txt

## Set its timestamps based on testfile.txt
touch -r testfile.txt newfile.txt

检查新文件的时间戳:

stat newfile.txt

输出:

  File: newfile.txt
  Size: 0           Blocks: 0          IO Block: 4096   regular empty file
Device: 801h/2049d  Inode: 2101100     Links: 1
Access: (0644/-rw-r--r--)  Uid: (1000/labex)   Gid: (1000/labex)
Access: 2023-01-01 12:00:00.000000000 +0000
Modify: 2023-01-01 12:00:00.000000000 +0000
Change: 2023-05-15 14:49:45.000000000 +0000
 Birth: -

现在,newfile.txt 的访问时间和修改时间与 testfile.txt 相匹配。

总结

在本次实验中,你学习了以下内容:

  • 了解 Linux 中三种类型的文件时间戳:修改时间(mtime)、访问时间(atime)和更改时间(ctime)
  • 使用带有各种选项的 ls 命令来显示文件时间戳
  • 使用 stat 命令查看详细的时间戳信息
  • 通过读取文件内容来更新访问时间
  • 通过更改文件权限来更新更改时间
  • 使用 touch 命令手动操作文件时间戳
  • 为文件应用特定的时间戳
  • 将一个文件的时间戳复制到另一个文件

这些技能对于在 Linux 中进行有效的文件管理和监控至关重要。文件时间戳有助于你跟踪更改、监控访问模式,并确保文件得到妥善维护。无论你是跟踪未经授权更改的系统管理员、调试文件问题的开发人员,还是整理文件的普通用户,了解文件时间戳都是在 Linux 环境中一项重要的技能。