简介
在 Linux 操作系统中,每个文件都有与之关联的时间戳,用于记录文件的修改时间、访问时间或属性更改时间。对于需要监控文件活动的系统管理员、开发人员和普通用户来说,了解这些时间戳至关重要。
本教程将指导你掌握在 Linux 中检查文件时间戳的实用技巧。你将学习如何使用不同的命令查看文件的修改时间和访问时间,从而更好地跟踪文件的更改情况并监控 Linux 环境中的文件使用模式。
在 Linux 操作系统中,每个文件都有与之关联的时间戳,用于记录文件的修改时间、访问时间或属性更改时间。对于需要监控文件活动的系统管理员、开发人员和普通用户来说,了解这些时间戳至关重要。
本教程将指导你掌握在 Linux 中检查文件时间戳的实用技巧。你将学习如何使用不同的命令查看文件的修改时间和访问时间,从而更好地跟踪文件的更改情况并监控 Linux 环境中的文件使用模式。
在 Linux 中,每个文件都有三个由系统自动维护的重要时间戳:
让我们通过创建一个测试文件并检查其属性来开始探索文件时间戳。
首先,打开终端并导航到你的项目目录:
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
在这个输出中:
这个基本列表显示了修改时间,但没有显示访问时间或更改时间。我们将在接下来的步骤中探索这些内容。
虽然 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: -
在这个输出中:
注意,目前这三个时间戳是相同的,因为我们刚刚创建了这个文件。让我们修改文件,看看这些时间戳会如何变化。
使用 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)就会更新。这是文件列表中默认最常显示的时间戳。
标准的 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-iso 或 iso:
ls -l --time-style=long-iso testfile.txt
输出:
-rw-r--r-- 1 labex labex 19 2023-05-15 14:35 testfile.txt
另一种检查修改时间的方法是使用 date 命令并搭配 -r 选项:
date -r testfile.txt
输出:
Mon May 15 14:35:12 UTC 2023
此命令会以人类可读的格式显示修改时间。
访问时间(atime)会在文件被读取或访问时更新。不过,许多现代 Linux 系统会使用 relatime 或 noatime 等挂载选项来减少 atime 更新的频率,以提高性能。
若要查看访问时间而非修改时间,可在 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 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 相匹配。
在本次实验中,你学习了以下内容:
ls 命令来显示文件时间戳stat 命令查看详细的时间戳信息touch 命令手动操作文件时间戳这些技能对于在 Linux 中进行有效的文件管理和监控至关重要。文件时间戳有助于你跟踪更改、监控访问模式,并确保文件得到妥善维护。无论你是跟踪未经授权更改的系统管理员、调试文件问题的开发人员,还是整理文件的普通用户,了解文件时间戳都是在 Linux 环境中一项重要的技能。