stat

stat 概述

  • stat:显示文件或文件系统状态。
1
2
3
4
5
6
7
8
9
10
[root@localhost ~]# stat /etc/passwd
File: ‘/etc/passwd’
Size: 2309 Blocks: 8 IO Block: 4096 regular file
Device: fd00h/64768d Inode: 34179165 Links: 1
Access: (0644/-rw-r--r--) Uid: ( 0/ root) Gid: ( 0/ root)
Context: system_u:object_r:passwd_file_t:s0
Access: 2023-11-08 11:30:30.944003508 +0800
Modify: 2023-11-08 11:30:30.939003508 +0800
Change: 2023-11-08 11:30:30.939003508 +0800
Birth: -

stat 常用命令

  • stat -f:显示文件系统状态而不是文件状态:
1
2
3
4
5
6
root@localhost ~]# stat -f /etc/passwd
File: "/etc/passwd"
ID: fd0000000000 Namelen: 255 Type: xfs
Block size: 4096 Fundamental block size: 4096
Blocks: Total: 9201265 Free: 8047984 Available: 8047984
Inodes: Total: 18411520 Free: 18277571
  • stat -t:以简洁的形式打印信息:
1
2
[root@localhost ~]# stat -t /etc/passwd
/etc/passwd 2309 8 81a4 0 0 fd00 34179165 1 0 0 1699414230 1699414230 1699414230 0 4096 system_u:object_r:passwd_file_t:s0

Linux 文件时间戳

  • 在文件系统中,atime、ctime 和 mtime 是与文件相关的时间戳。它们分别表示文件的访问时间、状态改变时间和修改时间。
  • 当一个文件被创建时,atime、ctime、mtime 均为当前时间:
1
2
3
4
5
6
7
8
9
10
[root@localhost ~]# touch demo ; stat demo
File: ‘demo’
Size: 0 Blocks: 0 IO Block: 4096 regular empty file
Device: fd00h/64768d Inode: 67764339 Links: 1
Access: (0644/-rw-r--r--) Uid: ( 0/ root) Gid: ( 0/ root)
Context: unconfined_u:object_r:admin_home_t:s0
Access: 2023-11-09 02:39:31.048447277 +0800
Modify: 2023-11-09 02:39:31.048447277 +0800
Change: 2023-11-09 02:39:31.048447277 +0800
Birth: -
  • 下面是它们的详细解释和区别。

atime

  • atime 是文件系统中的一个时间戳属性,表示文件的访问时间(Access Time),即最后一次读取文件内容的时间。
  • 每当一个文件被打开并读取时,文件系统会更新该文件的 atime。这包括对文件内容的读取操作,如查看文件内容、复制文件等。但是,仅仅查看文件的元数据(例如文件权限、大小等)而没有读取文件内容时,atime 不会被更新。
  • atime 可以用于跟踪文件的访问情况,了解文件的使用频率和活动。它在一些应用场景中很有用,例如:
    • 系统监控:通过检查文件的 atime,可以确定哪些文件最近被访问过,从而了解系统中哪些文件是活跃的。
    • 安全审计:atime 可以用于审计和监测文件的访问情况,特别是对于敏感文件或系统关键文件的访问记录。

注:更新文件的 atime 会导致文件系统的额外开销,因为每次读取文件时都要更新该属性。为了提高性能,某些操作系统和文件系统可能会延迟或禁用 atime 的更新。

1
2
3
4
5
6
7
8
9
10
11
# cat 查看
[root@localhost ~]# cat demo ; stat demo
File: ‘demo’
Size: 0 Blocks: 0 IO Block: 4096 regular empty file
Device: fd00h/64768d Inode: 67764339 Links: 1
Access: (0644/-rw-r--r--) Uid: ( 0/ root) Gid: ( 0/ root)
Context: unconfined_u:object_r:admin_home_t:s0
Access: 2023-11-09 02:39:44.135448054 +0800
Modify: 2023-11-09 02:39:31.048447277 +0800
Change: 2023-11-09 02:39:31.048447277 +0800
Birth: -

ctime

  • ctime 是文件系统中的一个时间戳属性,表示文件的状态改变时间(Change Time),也称为 inode 改变时间。

注:inode 包含了文件或目录的元数据,包括文件的权限、所有者、大小、时间戳以及文件的实际数据块的位置等信息。inode 的主要作用是提供文件系统对文件的索引和管理,它记录了文件系统中每个文件的详细信息。

  • ctime 记录的是文件的元数据(metadata)最后一次发生变化的时间,包括以下情况:
    • 修改文件的权限、所有者、组等元数据。
    • 修改文件的链接数目。
    • 重命名文件或移动文件到不同的目录。
    • 更改文件的大小。
    • 修改文件的扩展属性或ACL(访问控制列表)。
  • 需要注意的是,ctime 的更新与文件内容的修改无关。即使只是修改文件的权限或所有者,ctime 也会被更新。
  • ctime 在以下场景中有一些常见的应用:
    • 审计和安全:通过检查文件的 ctime,可以确定文件的元数据最近是否发生了变化,从而监控文件被更改的情况,以及检测潜在的安全问题。
    • 文件备份:在备份文件时,可以使用 ctime 来判断文件是否在备份前发生过更改。这可以帮助决定是否需要重新备份文件,以确保备份的数据是最新的。
1
2
3
4
5
6
7
8
9
10
[root@localhost ~]# chmod u=rw demo ; stat demo
File: ‘demo’
Size: 0 Blocks: 0 IO Block: 4096 regular empty file
Device: fd00h/64768d Inode: 67764339 Links: 1
Access: (0644/-rw-r--r--) Uid: ( 0/ root) Gid: ( 0/ root)
Context: unconfined_u:object_r:admin_home_t:s0
Access: 2023-11-09 02:39:44.135448054 +0800
Modify: 2023-11-09 02:39:31.048447277 +0800
Change: 2023-11-09 02:44:57.479466653 +0800
Birth: -

mtime

  • mtime 是文件系统中的一个时间戳属性,表示文件的修改时间(Modification Time),即文件内容最后一次被修改的时间。
  • 每当文件的内容被修改时,文件系统会更新该文件的 mtime。这包括对文件内容进行写入、编辑、附加等操作。但仅仅改变文件的元数据(例如权限、所有者等)而不修改文件内容时,mtime 不会被更新。
  • mtime 在许多情况下非常有用,例如:
    • 文件同步和备份:通过比较文件的 mtime,可以确定文件是否在上次同步或备份后发生了修改,从而有选择性地更新或备份文件。
    • 文件版本控制:在版本控制系统中,mtime 可以用作确定文件是否已被修改,并在提交修改时记录相应的版本信息。
    • 文件恢复:当文件意外损坏或丢失时,可以使用 mtime 来确定最近修改的备份或快照,并进行文件恢复。

注:ls -l 中时间戳表示的是文件的 mtime(Modification Time,修改时间),也就是文件内容最后一次被修改的时间。

1
2
3
4
5
6
7
8
9
10
11
12
13
[root@localhost ~]# echo 1 > demo ; stat demo 
File: ‘demo’
Size: 2 Blocks: 8 IO Block: 4096 regular file
Device: fd00h/64768d Inode: 67764339 Links: 1
Access: (0644/-rw-r--r--) Uid: ( 0/ root) Gid: ( 0/ root)
Context: unconfined_u:object_r:admin_home_t:s0
Access: 2023-11-09 02:39:44.135448054 +0800
Modify: 2023-11-09 02:46:42.621472894 +0800
Change: 2023-11-09 02:46:42.621472894 +0800
Birth: -

[root@localhost ~]# ls -l demo
-rw-r--r--. 1 root root 2 Nov 9 02:46 demo
  • 这里可以发现 ctime,也发生了改变,因为写入内容后大小发生了变化。

注:mtime 的改变必然导致 ctime 的改变,但是 ctime 不一定导致 mtime 的更改。

touch

touch 概述

  • touch 是一个常用的命令行工具,可在许多操作系统上使用,用于创建新文件或更新已存在文件的访问时间和修改时间。
  • 主要功能:
    • 创建新文件:如果指定的文件不存在,touch 命令可以创建一个新的空文件。可以通过指定文件名作为参数来创建文件,例如:touch example.txt 将创建一个名为 “example.txt” 的空文件。
    • 更新时间戳:touch 命令还可以用于更新已存在文件的时间戳。默认情况下,touch 命令会将文件的访问时间(atime)和修改时间(mtime)设置为当前时间。这对于需要手动更新文件时间戳的情况非常有用。

touch 常用命令

  • 使用 touch 命令时,可以使用以下参数来控制其行为。

  • touch:指定的文件不存在,touch 命令可以创建一个新的空文件:
1
2
3
4
5
6
7
8
9
10
[root@localhost ~]# touch demo ; stat demo
File: ‘demo’
Size: 2 Blocks: 8 IO Block: 4096 regular file
Device: fd00h/64768d Inode: 67764339 Links: 1
Access: (0644/-rw-r--r--) Uid: ( 0/ root) Gid: ( 0/ root)
Context: unconfined_u:object_r:admin_home_t:s0
Access: 2023-11-09 03:03:02.077531030 +0800
Modify: 2023-11-09 03:03:02.077531030 +0800
Change: 2023-11-09 03:03:02.077531030 +0800
Birth: -
  • touch -t:使用指定的时间戳来设置文件的时间戳:
1
2
3
4
5
6
7
8
9
10
[root@localhost ~]# touch -t 202312120000.00 demo ; stat demo
File: ‘demo’
Size: 2 Blocks: 8 IO Block: 4096 regular file
Device: fd00h/64768d Inode: 67764339 Links: 1
Access: (0644/-rw-r--r--) Uid: ( 0/ root) Gid: ( 0/ root)
Context: unconfined_u:object_r:admin_home_t:s0
Access: 2023-12-12 00:00:00.000000000 +0800
Modify: 2023-12-12 00:00:00.000000000 +0800
Change: 2023-11-09 03:03:32.007532807 +0800
Birth: -

注:在使用 touch -t 命令时,实际上修改了文件的时间戳信息,这被视为文件的元数据更改,因此 ctime 会被更新为当前时间。

  • touch -at:仅更新访问时间(atime),而不修改修改时间(mtime):
1
2
3
4
5
6
7
8
9
10
[root@localhost ~]# touch -at 202412120000.00 demo ; stat demo
File: ‘demo’
Size: 2 Blocks: 8 IO Block: 4096 regular file
Device: fd00h/64768d Inode: 67764339 Links: 1
Access: (0644/-rw-r--r--) Uid: ( 0/ root) Gid: ( 0/ root)
Context: unconfined_u:object_r:admin_home_t:s0
Access: 2024-12-12 00:00:00.000000000 +0800
Modify: 2023-12-12 00:00:00.000000000 +0800
Change: 2023-11-09 03:05:10.353538644 +0800
Birth: -
  • touch -mt:仅更新修改时间(mtime),而不修改访问时间(atime):
1
2
3
4
5
6
7
8
9
10
[root@localhost ~]# touch -mt 202512120000.00 demo ; stat demo
File: ‘demo’
Size: 2 Blocks: 8 IO Block: 4096 regular file
Device: fd00h/64768d Inode: 67764339 Links: 1
Access: (0644/-rw-r--r--) Uid: ( 0/ root) Gid: ( 0/ root)
Context: unconfined_u:object_r:admin_home_t:s0
Access: 2024-12-12 00:00:00.000000000 +0800
Modify: 2025-12-12 00:00:00.000000000 +0800
Change: 2023-11-09 03:05:25.730539557 +0800
Birth: -

find

  • 根据文件改变时间查找:
1
2
3
4
5
6
7
8
# 查找近7天被访问的文件
find / -atime -7

# 查找7天前被修改的文件
find / -mtime +7

# 查找第7天被修改的文件
find / -mtime 7