Linux命令之stat命令、inode内容--ctime,mtime,atime的区别

本文详细解析了Linux系统中文件的三种时间戳:atime、mtime和ctime的区别及应用场景,并介绍了如何通过ls命令查看这些时间戳。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

#1. [root@localhost tmp]# stat 1.txt 

  File: `1.txt'
  Size: 8               Blocks: 8          IO Block: 4096   regular file
Device: 802h/2050d      Inode: 196617      Links: 1
Access: (0644/-rw-r--r--)  Uid: (    0/    root)   Gid: (    0/    root)
Access: 2013-10-20 21:43:54.000000000 +0800
Modify: 2013-10-20 21:35:42.000000000 +0800
Change: 2013-10-20 21:35:42.000000000 +0800

#2. stat显示出inode的内容--inode包含文件的元信息,具体来说有以下内容:
  * 文件的字节数
  * 文件拥有者的User ID
  * 文件的Group ID
  * 文件的读、写、执行权限
  * 文件的时间戳,共有三个
  * 链接数,即有多少文件名指向这个inode
  * 文件数据block的位置

#3. IO Block:逻辑块的大小为4096个字节
    Blocks:物理最小块是512,而IO Block为4096,所以这里就占用了8个物理块的意思
    Access:atime
    Modify:mtime,修改时间,注意这个不是建立时间,m不是make的意思
    Change:ctime,改变时间

#4. 通过ls怎么查询这三个时间?
    ls -lc filename         列出文件的 ctime
    ls -lu filename         列出文件的 atime
    ls -l filename          列出文件的 mtime --ll默认显示的就是这个时间

#5. 这三个时间不好区别,但必须区别好,因为很多应用会考虑到这些时间,比如在做同步备份时,会判断时间,大于上次备份时间的文件要再次同步等,或在查找文件何时变化,何时被黑客入侵,都会用到这个。
    atime:访问时间,读取文件或者执行文件时会更改,命令如cat,vi
    mtime:修改时间,文件的内容被改变时,就会更改,如vi
    ctime:改变时间,文件的标签如属性、用户、用户组、权限、内容等被改变时,就会更改,如chmod,chown,vi

#6. 文件的时间戳(timestamp)是inode的内容之一,从inode来理解:ctime指inode上一次改变的时间,mtime指文件内容上一次修改的时间,atime指文件上一次打开的时间。

#7. atime不一定在访问文件之后被修改,因为:使用ext3文件系统的时候,如果在mount的时候使用了noatime参数那么就不会更新atime的信息,就是不想filesystem做太多的修改,而改善读取效能。


### Linux 中 `stat` 命令的功能及参数详解 #### 功能概述 `stat` 是一个用于显示文件或文件系统状态的命令工具。它能够提供关于文件的各种元数据信息,例如文件大小、权限、时间戳以及底层存储细节等[^1]。 --- #### 参数说明 以下是常用的 `stat` 命令参数及其作用: 1. **默认行为** 当运行 `stat 文件名` 时,默认会输出该文件的详细属性信息,包括但不限于文件名称、大小、块数、I/O 块大小、设备号、inode 编号、链接数量、访问权限、UID 和 GID、访问时间(Access)、修改时间(Modify)和变更时间(Change)。如果支持,则还会显示创建时间(Birth)[^2]。 示例: ```bash stat example.txt ``` 2. **自定义格式化输出 (`-c/--format`)** 使用 `-c` 或 `--format` 可以按照指定的格式输出文件的信息。这允许用户仅提取感兴趣的字段并控制其展示方式。 格式字符串中的占位符可以替换为实际值。例如: - `%n`: 文件名 - `%s`: 文件总字节数 - `%a`: 权限模式作为八进制表示 示例:只打印文件名和文件大小。 ```bash stat -c "%n: %s bytes" example.txt ``` 3. **无换行格式化输出 (`--printf`)** 这一选项类似于 `-c`,但它不会自动添加换行符到每条记录之后,因此适合于连续输出多个文件的结果。 示例:按特定格式输出文件名和大小。 ```bash stat --printf="Name: %n, Size: %s bytes\n" example.txt ``` 4. **显示文件系统信息 (`-f/--file-system`)** 如果希望查看某个路径所在文件系统的整体统计信息而非单个文件的数据,则可使用此标志。此类信息通常涉及文件系统的类型、挂载点位置以及其他特性描述。 示例:获取 `/home` 目录下文件系统的详情。 ```bash stat -f /home ``` --- #### 时间戳解释 通过执行标准形式下的 `stat` 调用可以获得三个主要的时间戳标记: - **Access**: 上次读取操作发生的具体时刻; - **Modify**: 数据最后一次被更改的确切日期与时间; - **Change**: 属性最后变动瞬间;即使内容未变但比如所有权转移也算作一次 change event[^2]。 注意,在某些较老版本的操作系统或者特殊类型的文件系统里可能缺乏 birth time 支持。 --- ```python import os from datetime import datetime def get_file_stats(file_path): stats = os.stat(file_path) access_time = datetime.fromtimestamp(stats.st_atime).strftime('%Y-%m-%d %H:%M:%S') modify_time = datetime.fromtimestamp(stats.st_mtime).strftime('%Y-%m-%d %H:%M:%S') change_time = datetime.fromtimestamp(stats.st_ctime).strftime('%Y-%m-%d %H:%M:%S') result = { 'File': file_path, 'Size': f'{stats.st_size} Bytes', 'Blocks': stats.st_blocks, 'IO_Block': stats.st_blksize, 'Device': hex(stats.st_dev), 'Inode': stats.st_ino, 'Links': stats.st_nlink, 'Permissions': oct(stats.st_mode)[-4:], 'User ID': stats.st_uid, 'Group ID': stats.st_gid, 'Access Time': access_time, 'Modification Time': modify_time, 'Status Change Time': change_time } return result print(get_file_stats('example.txt')) ``` 上述 Python 脚本展示了如何利用内置库模拟部分 `stat` 行为来检索本地文件的状态报告。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值