linux下获取文件的创建时间与实战教程
背景
有时候我们需要获取文件的创建时间。
例如:
我在研究《xtrabackup原理图》的时候,想通过观察确认xtrabackup_log是最早创建并且是最晚保存的文件。我们就需要知道xtrabackup_logfile这个文件的创建时间戳和修改时间戳。
复习:Linux关于文件的三个时间戳
Linux的文件系统保存有三个时间戳,利用stat指令查看文件信息可以获取。他们分别是ATime、MTime和CTime
[root@192-168-199-198backups]#stat2.txt File:‘2.txt' Size:16Blocks:8IOBlock:4096regularfile Device:821h/2081dInode:15Links:1 Access:(0644/-rw-r--r--)Uid:(0/root)Gid:(0/root) Access:2019-07-2312:12:14.276981038+0800 Modify:2019-07-2312:12:41.415980158+0800 Change:2019-07-2312:12:41.415980158+0800 Birth:-
ATime——文件的最近访问时间
只要读取文件,ATime就会更新,对应的是stat命令获取的Access的值。
[root@192-168-199-198backups]#cat2.txt#<--读取文件 121231233123123 [root@192-168-199-198backups]#stat2.txt File:‘2.txt' Size:16Blocks:8IOBlock:4096regularfile Device:821h/2081dInode:15Links:1 Access:(0644/-rw-r--r--)Uid:(0/root)Gid:(0/root) Access:2019-07-2312:22:09.644961733+0800#<--时间变化了 Modify:2019-07-2312:12:41.415980158+0800 Change:2019-07-2312:12:41.415980158+0800 Birth:-
MTime——文件的内容最近修改的时间
当文件进行被写的时候,CTime就会更新,对应的是stat命令获取的Modify的值。
[root@192-168-199-198backups]#echohello_world>2.txt#<--修改文件内容 [root@192-168-199-198backups]#stat2.txt File:‘2.txt' Size:12Blocks:8IOBlock:4096regularfile Device:821h/2081dInode:15Links:1 Access:(0644/-rw-r--r--)Uid:(0/root)Gid:(0/root) Access:2019-07-2312:22:09.644961733+0800 Modify:2019-07-2312:26:23.466953503+0800#<--时间变化了 Change:2019-07-2312:26:23.466953503+0800 Birth:-
这里不要用vi修改文件内容,因为用vi修改文件内容有可能会引起Inode变更,也就是你观察的文件并不是之前的文件了!这个和vi的原理有关。
CTime——文件属性最近修改的时间
当文件的目录被修改,或者文件的所有者,权限等被修改时,CTime也就会更新,对应的是stat命令获取的Change的值。
[root@192-168-199-198backups]#chmod7772.txt#<--修改文件属性 [root@192-168-199-198backups]#stat2.txt File:‘2.txt' Size:12Blocks:8IOBlock:4096regularfile Device:821h/2081dInode:15Links:1 Access:(0777/-rwxrwxrwx)Uid:(0/root)Gid:(0/root) Access:2019-07-2312:22:09.644961733+0800 Modify:2019-07-2312:26:23.466953503+0800 Change:2019-07-2312:30:35.830945320+0800#<--时间变化了 Birth:-
Linux无法获取文件创建时间?
现在我们知道了Linux有三种时间,ATime、MTime和CTime,那么很好奇为什么没有CRTime(创建时间)呢?
对比Windows系统(上图),Windows的NTFS文件系统里存在三个时间戳,其中就包含了“创建时间”,但在Linux的设计哲学上没有文件“创建时间”这么一说,所以早期版本的ext文件系统不支持文件“创建时间”。但从ext4版本开始,文件创建时间存储在ext4文件系统的inode中,所以ext4文件系统使用特殊方法也是可以获取文件的创建时间的。
也说明了,是否能获取文件的创建时间,和文件系统是否支持有关。
Linux上获取文件创建时间的步骤
CentOS7Linux系统自带一个工具,叫做debugfs,他可以查出ext4文件系统上的文件的创建时间。mandebugfs发现工具的描述是“ext2/ext3/ext4filesystemdebugger”,所以他是不支持xfs文件系统的。
常用的xfs文件系统是否支持获取文件创建时间,还有如何获取,这个暂时不清楚,需读者查阅官方文档
1.获取文件的inode号
方法一:
[root@192-168-199-198backups]#stat/backups/2.txt File:‘/backups/2.txt' Size:30Blocks:8IOBlock:4096regularfile Device:821h/2081dInode:14#<---这个Links:1 Access:(0644/-rw-r--r--)Uid:(0/root)Gid:(0/root) Access:2019-07-2312:49:11.462909146+0800 Modify:2019-07-2312:49:11.462909146+0800 Change:2019-07-2313:08:20.138871900+0800 Birth:-
方法二:
[root@192-168-199-198backups]#ls-i/backups/2.txt 14/backups/2.txt
这里,我们获取的inode编号是14。
2.查找文件所在磁盘路径
[root@192-168-199-198backups]#df-h FilesystemSizeUsedAvailUse%Mountedon /dev/mapper/centos-root46G23G24G49%/ devtmpfs3.8G03.8G0%/dev tmpfs3.9G8.0K3.9G1%/dev/shm tmpfs3.9G12M3.8G1%/run tmpfs3.9G03.9G0%/sys/fs/cgroup /dev/sdb1100G77G24G77%/data2 /dev/sdc150G53M47G1%/backups#<---可以看出文件在这里面 /dev/sda11014M142M873M14%/boot tmpfs781M0781M0%/run/user/0
磁盘路径为/dev/sdc1
3.使用debugfs查看文件创建时间
[root@192-168-199-198backups]#debugfs-R'stat<14>'/dev/sdc1 debugfs1.42.9(28-Dec-2013) Inode:14Type:regularMode:0644Flags:0x80000 Generation:737271740Version:0x00000000:00000001 User:0Group:0Size:30 FileACL:0DirectoryACL:0 Links:1Blockcount:8 Fragment:Address:0Number:0Size:0 ctime:0x5d369644:211c1170--TueJul2313:08:202019 atime:0x5d3691c7:6e5dbb68--TueJul2312:49:112019 mtime:0x5d3691c7:6e5dbb68--TueJul2312:49:112019 crtime:0x5d3691c7:6e5dbb68--TueJul2312:49:112019 Sizeofextrainodefields:28 EXTENTS: (0):35337
获取文件创建时间的脚本
鉴于获取文件创建时间步骤操作有点麻烦(虽然只有三步:))
我这里提供了一个脚本
vistatx #!/bin/sh [$#-ne1]&&echo"Usage:$0{FILENAME}"&&exit1 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 unsetarray[$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}isnotmountontypeext4!Onlyext4filesystemsupport!;exit2;} debugfs-R"stat<${INODE}>"${DISK}
使用:
chmod+xstatx mvstatx/usr/sbin/statx [root@192-168-199-198backups]#statx2.txt debugfs1.42.9(28-Dec-2013) Inode:14Type:regularMode:0644Flags:0x80000 Generation:737271740Version:0x00000000:00000001 User:0Group:0Size:30 FileACL:0DirectoryACL:0 Links:1Blockcount:8 Fragment:Address:0Number:0Size:0 ctime:0x5d369644:211c1170--TueJul2313:08:202019 atime:0x5d36bb8f:56eb1e70--TueJul2315:47:272019 mtime:0x5d3691c7:6e5dbb68--TueJul2312:49:112019 crtime:0x5d3691c7:6e5dbb68--TueJul2312:49:112019 Sizeofextrainodefields: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.-typef>/tmp/1.txt foriin`cat/tmp/1.txt` do {echo-n$i"";statx$i2>/dev/null|grepcrtime|awk'{print$7}';}>>/tmp/2.txt done cat/tmp/2.txt|sort-k2|less ###以下为输出### ./ibdata123:32:59 ./xtrabackup_logfile23:32:59#<---可以看出这个文件是最早创建的 ./mysql/engine_cost.ibd23:33:00 ./mysql/gtid_executed.ibd23:33:00 ./mysql/help_category.ibd23:33:00 ./mysql/help_keyword.ibd23:33:00 ./mysql/help_relation.ibd23:33:00 ./mysql/help_topic.ibd23:33:00 ./mysql/innodb_index_stats.ibd23:33:00 ./mysql/innodb_table_stats.ibd23:33:00 ./mysql/plugin.ibd23:33:00 ./mysql/server_cost.ibd23:33:00 ./mysql/servers.ibd23:33:00 ./mysql/slave_master_info.ibd23:33:00 ./mysql/slave_relay_log_info.ibd23:33:00 ./mysql/slave_worker_info.ibd23:33:00 ./mysql/time_zone.ibd23:33:00 ./mysql/time_zone_leap_second.ibd23:33:00 ... ./zabbix/trigger_tag.frm23:33:09 ./zabbix/users.frm23:33:09 ./zabbix/users_groups.frm23:33:09 ./zabbix/usrgrp.frm23:33:09 ./zabbix/valuemaps.frm23:33:09 ./zabbix/widget_field.frm23:33:09 ./zabbix/widget.frm23:33:09
3.查找所有备份文件的mtime
>/tmp/1.txt >/tmp/2.txt find.-typef>/tmp/1.txt foriin`cat/tmp/1.txt` do {echo-n$i"";statx$i2>/dev/null|grepmtime|awk'{print$7}';}>>/tmp/2.txt done cat/tmp/2.txt|sort-k2|less ###以下为输出### ./ibdata123:33:00 ./mysql/engine_cost.ibd23:33:00 ./mysql/gtid_executed.ibd23:33:00 ./mysql/help_category.ibd23:33:00 ./mysql/help_keyword.ibd23:33:00 ./mysql/help_relation.ibd23:33:00 ./mysql/help_topic.ibd23:33:00 ./mysql/innodb_index_stats.ibd23:33:00 ./mysql/innodb_table_stats.ibd23:33:00 ./mysql/plugin.ibd23:33:00 ... ./xtrabackup_logfile23:33:09#<---可以看出这个文件是最后修改和保存的 ./zabbix/acknowledges.frm23:33:09 ./zabbix/actions.frm23:33:09 ... ./zabbix/users_groups.frm23:33:09 ./zabbix/usrgrp.frm23:33:09 ./zabbix/valuemaps.frm23:33:09 ./zabbix/widget_field.frm23:33:09 ./zabbix/widget.frm23:33:09
最后,我们通过文件的创建时间和修改时间,实战地验证了《xtrabackup原理图》的第一和第七步顺序的正确性。
总结
以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,谢谢大家对毛票票的支持。
声明:本文内容来源于网络,版权归原作者所有,内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:czq8825#qq.com(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。