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 file device: 821h/2081d inode: 15 links: 1 access: (0644/-rw-r--r--) uid: ( 0/ root) gid: ( 0/ root) access: 2019-07-23 12:12:14.276981038 +0800 modify: 2019-07-23 12:12:41.415980158 +0800 change: 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 file device: 821h/2081d inode: 15 links: 1 access: (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 +0800 change: 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 file device: 821h/2081d inode: 15 links: 1 access: (0644/-rw-r--r--) uid: ( 0/ root) gid: ( 0/ root) access: 2019-07-23 12:22:09.644961733 +0800 modify: 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 file device: 821h/2081d inode: 15 links: 1 access: (0777/-rwxrwxrwx) uid: ( 0/ root) gid: ( 0/ root) access: 2019-07-23 12:22:09.644961733 +0800 modify: 2019-07-23 12:26:23.466953503 +0800 change: 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 file device: 821h/2081d inode: 14 #<--- 这个 links: 1 access: (0644/-rw-r--r--) uid: ( 0/ root) gid: ( 0/ root) access: 2019-07-23 12:49:11.462909146 +0800 modify: 2019-07-23 12:49:11.462909146 +0800 change: 2019-07-23 13:08:20.138871900 +0800 birth: -
方法二:
[root@192-168-199-198 backups]# ls -i /backups/2.txt 14 /backups/2.txt
这里,我们获取的 inode 编号是 14。
2. 查找文件所在磁盘路径
[root@192-168-199-198 backups]# df -h filesystem size used avail use% mounted on /dev/mapper/centos-root 46g 23g 24g 49% / devtmpfs 3.8g 0 3.8g 0% /dev tmpfs 3.9g 8.0k 3.9g 1% /dev/shm tmpfs 3.9g 12m 3.8g 1% /run tmpfs 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% /boot tmpfs 781m 0 781m 0% /run/user/0
磁盘路径为 /dev/sdc1
3. 使用debugfs 查看文件创建时间
[root@192-168-199-198 backups]# debugfs -r 'stat <14>' /dev/sdc1 debugfs 1.42.9 (28-dec-2013) inode: 14 type: regular mode: 0644 flags: 0x80000 generation: 737271740 version: 0x00000000:00000001 user: 0 group: 0 size: 30 file acl: 0 directory acl: 0 links: 1 blockcount: 8 fragment: 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 2019 crtime: 0x5d3691c7:6e5dbb68 -- tue jul 23 12:49:11 2019 size of extra inode fields: 28 extents: (0):35337
获取文件创建时间的脚本
鉴于获取文件创建时间步骤操作有点麻烦 (虽然只有三步 :) )
我这里提供了一个脚本
vi statx #!/bin/sh [ $# -ne 1 ] && echo "usage: $0 {filename}" && exit 1 inode=`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 ]] && break done #不是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 statx mv statx /usr/sbin/statx [root@192-168-199-198 backups]# statx 2.txt debugfs 1.42.9 (28-dec-2013) inode: 14 type: regular mode: 0644 flags: 0x80000 generation: 737271740 version: 0x00000000:00000001 user: 0 group: 0 size: 30 file acl: 0 directory acl: 0 links: 1 blockcount: 8 fragment: 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 2019 crtime: 0x5d3691c7:6e5dbb68 -- tue jul 23 12:49:11 2019 size of extra inode fields: 28 extents: (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.txt find . -type f >/tmp/1.txt for i in `cat /tmp/1.txt` do { echo -n $i" ";statx $i 2>/dev/null |grep crtime |awk '{print $7}'; } >>/tmp/2.txt done cat /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.txt find . -type f >/tmp/1.txt for i in `cat /tmp/1.txt` do { echo -n $i" ";statx $i 2>/dev/null |grep mtime |awk '{print $7}'; } >>/tmp/2.txt done cat /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 原理图》的第一和第七步顺序的正确性。
总结
以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,谢谢大家对的支持。
下一篇: 关羽投降曹操之后 关羽在曹营中待了多久