千家信息网

linux下获取文件的创建时间与实战教程

发表于:2025-12-01 作者:千家信息网编辑
千家信息网最后更新 2025年12月01日,背景有时候我们需要获取文件的创建时间。例如:我在研究 《xtrabackup 原理图》的时候,想通过观察确认 xtrabackup_log 是最早创建 并且是 最晚保存的文件。我们就需要知道 xtra
千家信息网最后更新 2025年12月01日linux下获取文件的创建时间与实战教程

背景

有时候我们需要获取文件的创建时间。

例如:

我在研究 《xtrabackup 原理图》的时候,想通过观察确认 xtrabackup_log 是最早创建 并且是 最晚保存的文件。我们就需要知道 xtrabackup_logfile 这个文件的创建时间戳和修改时间戳。

复习: Linux关于文件的三个时间戳

Linux 的文件系统保存有三个时间戳,利用 stat 指令查看文件信息可以获取。他们分别是 ATime、MTime 和 CTime

[root@192-168-199-198 backups]# stat 2.txt  File: '2.txt' Size: 16   Blocks: 8   IO Block: 4096 regular fileDevice: 821h/2081d Inode: 15   Links: 1Access: (0644/-rw-r--r--) Uid: ( 0/ root) Gid: ( 0/ root)Access: 2019-07-23 12:12:14.276981038 +0800Modify: 2019-07-23 12:12:41.415980158 +0800Change: 2019-07-23 12:12:41.415980158 +0800 Birth: -

ATime --文件的最近访问时间

只要读取文件,ATime 就会更新,对应的是 stat 命令获取的 Access 的值。

[root@192-168-199-198 backups]# cat 2.txt #<-- 读取文件121231233123123[root@192-168-199-198 backups]# stat 2.txt  File: '2.txt' Size: 16   Blocks: 8   IO Block: 4096 regular fileDevice: 821h/2081d Inode: 15   Links: 1Access: (0644/-rw-r--r--) Uid: ( 0/ root) Gid: ( 0/ root)Access: 2019-07-23 12:22:09.644961733 +0800 #<-- 时间变化了Modify: 2019-07-23 12:12:41.415980158 +0800Change: 2019-07-23 12:12:41.415980158 +0800 Birth: -

MTime --文件的内容最近修改的时间

当文件进行被写的时候,CTime 就会更新,对应的是 stat 命令获取的 Modify 的值。

[root@192-168-199-198 backups]# echo hello_world > 2.txt #<-- 修改文件内容[root@192-168-199-198 backups]# stat 2.txt  File: '2.txt' Size: 12   Blocks: 8   IO Block: 4096 regular fileDevice: 821h/2081d Inode: 15   Links: 1Access: (0644/-rw-r--r--) Uid: ( 0/ root) Gid: ( 0/ root)Access: 2019-07-23 12:22:09.644961733 +0800Modify: 2019-07-23 12:26:23.466953503 +0800 #<-- 时间变化了Change: 2019-07-23 12:26:23.466953503 +0800 Birth: -

这里不要用vi修改文件内容,因为用vi修改文件内容有可能会引起Inode变更,也就是你观察的文件并不是之前的文件了!这个和vi的原理有关。

CTime --文件属性最近修改的时间

当文件的目录被修改,或者文件的所有者,权限等被修改时,CTime 也就会更新,对应的是 stat 命令获取的 Change 的值。

[root@192-168-199-198 backups]# chmod 777 2.txt #<-- 修改文件属性[root@192-168-199-198 backups]# stat 2.txt  File: '2.txt' Size: 12   Blocks: 8   IO Block: 4096 regular fileDevice: 821h/2081d Inode: 15   Links: 1Access: (0777/-rwxrwxrwx) Uid: ( 0/ root) Gid: ( 0/ root)Access: 2019-07-23 12:22:09.644961733 +0800Modify: 2019-07-23 12:26:23.466953503 +0800Change: 2019-07-23 12:30:35.830945320 +0800 #<-- 时间变化了 Birth: -

Linux 无法获取文件创建时间?

现在我们知道了Linux有三种时间,ATime、MTime 和 CTime,那么很好奇为什么没有 CRTime (创建时间) 呢?

对比 Windows 系统 (上图),Windows 的 NTFS 文件系统里存在三个时间戳,其中就包含了"创建时间",但在 Linux 的设计哲学上没有文件"创建时间"这么一说,所以早期版本的ext文件系统不支持文件"创建时间"。但从 ext4 版本开始,文件创建时间存储在ext4文件系统的inode中,所以 ext4 文件系统使用特殊方法也是可以获取文件的创建时间的。

也说明了,是否能获取文件的创建时间,和文件系统是否支持有关。

Linux 上获取文件创建时间的步骤

CentOS7 Linux系统自带一个工具,叫做 debugfs,他可以查出 ext4 文件系统上的文件的创建时间。man debugfs 发现工具的描述是 "ext2/ext3/ext4 file system debugger",所以他是不支持 xfs 文件系统的。

常用的 xfs 文件系统是否支持获取文件创建时间,还有如何获取,这个暂时不清楚,需读者查阅官方文档

1. 获取文件的 inode 号

方法一:

[root@192-168-199-198 backups]# stat /backups/2.txt File: '/backups/2.txt' Size: 30   Blocks: 8   IO Block: 4096 regular fileDevice: 821h/2081d Inode: 14 #<--- 这个  Links: 1Access: (0644/-rw-r--r--) Uid: ( 0/ root) Gid: ( 0/ root)Access: 2019-07-23 12:49:11.462909146 +0800Modify: 2019-07-23 12:49:11.462909146 +0800Change: 2019-07-23 13:08:20.138871900 +0800 Birth: -

方法二:

[root@192-168-199-198 backups]# ls -i /backups/2.txt14 /backups/2.txt

这里,我们获取的 inode 编号是 14。

2. 查找文件所在磁盘路径

[root@192-168-199-198 backups]# df -hFilesystem        Size Used Avail Use% Mounted on/dev/mapper/centos-root  46G  23G  24G 49% /devtmpfs         3.8G   0 3.8G  0% /devtmpfs          3.9G 8.0K 3.9G  1% /dev/shmtmpfs          3.9G  12M 3.8G  1% /runtmpfs          3.9G   0 3.9G  0% /sys/fs/cgroup/dev/sdb1        100G  77G  24G 77% /data2/dev/sdc1         50G  53M  47G  1% /backups  #<--- 可以看出文件在这里面/dev/sda1        1014M 142M 873M 14% /boottmpfs          781M   0 781M  0% /run/user/0

磁盘路径为 /dev/sdc1

3. 使用debugfs 查看文件创建时间

[root@192-168-199-198 backups]# debugfs -R 'stat <14>' /dev/sdc1debugfs 1.42.9 (28-Dec-2013)Inode: 14  Type: regular  Mode: 0644  Flags: 0x80000Generation: 737271740  Version: 0x00000000:00000001User:   0  Group:   0  Size: 30File ACL: 0  Directory ACL: 0Links: 1  Blockcount: 8Fragment: Address: 0  Number: 0  Size: 0 ctime: 0x5d369644:211c1170 -- Tue Jul 23 13:08:20 2019 atime: 0x5d3691c7:6e5dbb68 -- Tue Jul 23 12:49:11 2019 mtime: 0x5d3691c7:6e5dbb68 -- Tue Jul 23 12:49:11 2019crtime: 0x5d3691c7:6e5dbb68 -- Tue Jul 23 12:49:11 2019Size of extra inode fields: 28EXTENTS:(0):35337

获取文件创建时间的脚本

鉴于获取文件创建时间步骤操作有点麻烦 (虽然只有三步 :) )

我这里提供了一个脚本

vi statx#!/bin/sh[ $# -ne 1 ] && echo "Usage:   $0 {FILENAME}" && exit 1INODE=`ls -i $1 |awk '{print $1}'`FILENAME=$1#如果传入参数带/,则获取这个传入参数的目录路径并进入目录 `echo $FILENAME |grep / 1> /dev/null` && { FPWD=${FILENAME%/*};FPWD=${FPWD:=/};cd ${FPWD};FPWD=`pwd`; } || FPWD=`pwd` array=(`echo ${FPWD} | sed 's@/@ @g'`)array_length=${#array[@]}for ((i=${array_length};i>=0;i--))do unset array[$i] SUBPWD=`echo " "${array[@]} | sed 's@ @/@g'` DISK=`df -h |grep ${SUBPWD}$ |awk '{print $1}'` [[ -n $DISK ]] && breakdone #不是ext4就退出[[ "`mount |grep ${DISK} |awk '{print $5}'`" != "ext4" ]] && { echo ${DISK} is not mount on type ext4! Only ext4 file system support!;exit 2; }debugfs -R "stat <${INODE}>" ${DISK}

使用:

chmod +x statxmv statx /usr/sbin/statx[root@192-168-199-198 backups]# statx 2.txtdebugfs 1.42.9 (28-Dec-2013)Inode: 14  Type: regular  Mode: 0644  Flags: 0x80000Generation: 737271740  Version: 0x00000000:00000001User:   0  Group:   0  Size: 30File ACL: 0  Directory ACL: 0Links: 1  Blockcount: 8Fragment: Address: 0  Number: 0  Size: 0 ctime: 0x5d369644:211c1170 -- Tue Jul 23 13:08:20 2019 atime: 0x5d36bb8f:56eb1e70 -- Tue Jul 23 15:47:27 2019 mtime: 0x5d3691c7:6e5dbb68 -- Tue Jul 23 12:49:11 2019crtime: 0x5d3691c7:6e5dbb68 -- Tue Jul 23 12:49:11 2019Size of extra inode fields: 28EXTENTS:(0):35337

!!!请谨慎在生产环境使用,shell脚本没有做太多的异常处理,不支持管道,不支持目录也没有经过大量的测试

实战
我们回过头来,用这个方法,确认《xtrabackup 原理图》是否准确。

我们需要验证的是:

xtrabackup_log 是最早创建 并且是 最晚保存的文件

1. 创建备份

DATE=`date "+%Y%m%d%H%M%S"`xtrabackup -uroot -proot \ -S /tmp/mysql3306.sock \ --backup \ --target-dir=/backups/$DATE

2. 查找所有备份文件的crtime

cd /backups/$DATE>/tmp/1.txt>/tmp/2.txtfind . -type f >/tmp/1.txtfor i in `cat /tmp/1.txt`do { echo -n $i" ";statx $i 2>/dev/null |grep crtime |awk '{print $7}'; } >>/tmp/2.txtdonecat /tmp/2.txt |sort -k2 |less###以下为输出###./ibdata1 23:32:59./xtrabackup_logfile 23:32:59 #<---可以看出这个文件是最早创建的./mysql/engine_cost.ibd 23:33:00./mysql/gtid_executed.ibd 23:33:00./mysql/help_category.ibd 23:33:00./mysql/help_keyword.ibd 23:33:00./mysql/help_relation.ibd 23:33:00./mysql/help_topic.ibd 23:33:00./mysql/innodb_index_stats.ibd 23:33:00./mysql/innodb_table_stats.ibd 23:33:00./mysql/plugin.ibd 23:33:00./mysql/server_cost.ibd 23:33:00./mysql/servers.ibd 23:33:00./mysql/slave_master_info.ibd 23:33:00./mysql/slave_relay_log_info.ibd 23:33:00./mysql/slave_worker_info.ibd 23:33:00./mysql/time_zone.ibd 23:33:00./mysql/time_zone_leap_second.ibd 23:33:00..../zabbix/trigger_tag.frm 23:33:09./zabbix/users.frm 23:33:09./zabbix/users_groups.frm 23:33:09./zabbix/usrgrp.frm 23:33:09./zabbix/valuemaps.frm 23:33:09./zabbix/widget_field.frm 23:33:09./zabbix/widget.frm 23:33:09

3. 查找所有备份文件的mtime

>/tmp/1.txt>/tmp/2.txtfind . -type f >/tmp/1.txtfor i in `cat /tmp/1.txt`do { echo -n $i" ";statx $i 2>/dev/null |grep mtime |awk '{print $7}'; } >>/tmp/2.txtdonecat /tmp/2.txt |sort -k2 |less###以下为输出###./ibdata1 23:33:00./mysql/engine_cost.ibd 23:33:00./mysql/gtid_executed.ibd 23:33:00./mysql/help_category.ibd 23:33:00./mysql/help_keyword.ibd 23:33:00./mysql/help_relation.ibd 23:33:00./mysql/help_topic.ibd 23:33:00./mysql/innodb_index_stats.ibd 23:33:00./mysql/innodb_table_stats.ibd 23:33:00./mysql/plugin.ibd 23:33:00..../xtrabackup_logfile 23:33:09 #<---可以看出这个文件是最后修改和保存的./zabbix/acknowledges.frm 23:33:09./zabbix/actions.frm 23:33:09..../zabbix/users_groups.frm 23:33:09./zabbix/usrgrp.frm 23:33:09./zabbix/valuemaps.frm 23:33:09./zabbix/widget_field.frm 23:33:09./zabbix/widget.frm 23:33:09

最后,我们通过文件的创建时间和修改时间,实战地验证了《xtrabackup 原理图》的第一和第七步顺序的正确性。

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,谢谢大家对的支持。

文件 时间 系统 支持 内容 原理 方法 目录 三个 命令 备份 脚本 路径 变化 更新 实战 参数 属性 工具 时候 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 数据库课设教务 无法在当前上下文访问数据库 成都学软件开发需要多少钱 朝阳区智能化网络技术服务怎么样 番禺举办网络安全宣传直播 公务员网络安全技术 我的世界服务器做盔甲 计算机网络技术笔记本子推荐 山东网络安全等级 河北pdu服务器专用电源 逆战游戏链接不上服务器 wow服务器转服到pvp 新泰市亮点网络技术有限公司 收款码服务器连接失败怎么办 网络安全国家战略研究王 将要率领一个软件开发小组 如何判断域信息中哪些是服务器 莱西专业软件开发公司电话 冯步安网络安全 数据库集群是否使用中间件 重庆管理软件开发有哪些 广西智慧医养软件开发电话 网络安全情景剧多人 lbs移动数据库 商品三级种类数据库设计 提供网络安全信息公示备案 icloud 服务器错误 设计logo免费软件开发 云计算跟网络安全属于哪个板块 美军网络安全试验鉴定刘映国
0