linux下获取文件的创建时间与实战教程
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
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 原理图》的第⼀和第七步顺序的正确性。
总结
以上就是这篇⽂章的全部内容了,希望本⽂的内容对⼤家的学习或者⼯作具有⼀定的参考学习价值,谢谢⼤家对的⽀持。