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=${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" ]] &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 原理图》的第一和第七步顺序的正确性。

总结

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

(0)

相关推荐

  • 解析Linux文件夹文件创建、删除

    本篇主要介绍了文件夹文件创建.删除,具体如下: Linux删除文件夹命令 linux删除目录很简单,很多人还是习惯用rmdir,不过一旦目录非空,就陷入深深的苦恼之中,现在使用rm -rf命令即可. 直接rm就可以了,不过要加两个参数-rf 即:rm -rf 目录名字  删除目录.文件 rm(remove) 功能说明:删除文件或目录. 语 法:rm [-dfirv][--help][--version][文件或目录...] 补充说明:执行rm指令可删除文件或目录,如欲删除目录必须加上参数"-r&

  • Linux下查看binlog文件创建时间的命令

    背景 MySQL在26日 16:23:49产生了大量的慢查询,在这段时间内,binlog文件刷新的很快(查看慢日志是mysql DML并发比较多),想知道写完一个binlog文件究竟花了几分钟时间? 分析 •三个binlog文件的最后修改间隔时间分别是2 分钟和1 分钟 •同一个事务只能写同一个binlog文件 •mysql-bin.016126文件的最后修改时间16:22不一定是mysql-bin.016127 文件创建的时间(存在大事务的情况下,大事务还在写上一个binlog文件,新的事务已

  • 在Linux分区或逻辑卷中创建文件系统的方法

    前言 学习在你的系统中创建一个文件系统,并且长期或者非长期地挂载它. 在计算技术中,文件系统控制如何存储和检索数据,并且帮助组织存储媒介中的文件.如果没有文件系统,信息将被存储为一个大数据块,而且你无法知道一条信息在哪结束,下一条信息在哪开始.文件系统通过为存储数据的文件提供名称,并且在文件系统中的磁盘上维护文件和目录表以及它们的开始和结束位置.总的大小等来帮助管理所有的这些信息. 在 Linux 中,当你创建一个硬盘分区或者逻辑卷之后,接下来通常是通过格式化这个分区或逻辑卷来创建文件系统.这个

  • Linux命令创建日期文件夹或者文件的实例代码

    touch 命令:用于创建文件 mkdir 命令:用于创建文件夹 date 命令:获取系统时间关于date获取系统时间选项 %Y:年 %m:月 %d:日 %H:小时 %M:分钟 %S:秒 实例1: 创建文件夹 mkdir date +%Y%m%d 生成文件夹格式YYYYmmdd [cqs@centos7 data]$ mkdir date +%Y%m%d [cqs@centos7 data]$ ls 20190724 mkdir date +%Y-%m-%d 生成文件夹格式YYYY-mm-dd

  • 使用golang获取linux上文件的访问/创建/修改时间

    在linux上想获取文件的元信息,我们需要使用系统调用lstat或者stat. 在golang的os包里已经把stat封装成了Stat函数,使用它比使用syscall要方便不少. 这是os.Stat的原型: func Stat(name string) (FileInfo, error)     Stat returns a FileInfo describing the named file. If there is an error, it     will be of type *Path

  • 如何创建Linux的swap交换分区文件的方法步骤

    Swap简介 Linux中Swap(即:交换分区),类似于Windows的虚拟内存,就是当内存不足的时候,把一部分硬盘空间虚拟成内存使用,从而解决内存容量不足的情况. 如何创建Swap文件 1. 创建一个用于交换的文件 sudo fallocate -l 1G /swapfile 如果faillocate未安装或者您收到错误消息,fallocate failed: Operation not supported则可以使用以下命令创建交换文件: sudo dd if=/dev/zero of=/s

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

    背景 有时候我们需要获取文件的创建时间. 例如: 我在研究 <xtrabackup 原理图>的时候,想通过观察确认 xtrabackup_log 是最早创建 并且是 最晚保存的文件.我们就需要知道 xtrabackup_logfile 这个文件的创建时间戳和修改时间戳. 复习: Linux关于文件的三个时间戳 Linux 的文件系统保存有三个时间戳,利用 stat 指令查看文件信息可以获取.他们分别是 ATime.MTime 和 CTime [root@192-168-199-198 back

  • Windows环境bat脚本获取文件的创建时间

    windows环境获取时间相关概念 1.windows下DOS窗口date格式 针对date的结果将其进行格式化显示,如:YYYY-MM-DD 就要进行如下操作: 日期截取遵从格式 %date:~x,y%,表示从第x位开始,截取y个长度(x,y的起始值为0) 年份从第0位开始截取4位,月份从第5位开始截取2位,日期从第8位开始截取2位 2.windows下DOS窗口time格式 针对time的结果将其进行格式化显示,如:HH:MM:SS就要进行如下操作: 时间截取遵从格式 %time:~x,y%

  • vbscript获取文件的创建时间、最后修改时间和最后访问时间的方法

    复制代码 代码如下: set fso=createobject("Scripting.FileSystemObject") set fn=fso.GetFile("E:\AD.txt") msgbox "文件创建时间:"&fn.DateCreated msgbox "文件最后修改时间:"&fn.DateLastModified msgbox "文件最后访问时间:"&fn.DateLa

  • Linux中如何查看文件的创建时间详解

    一.简介 Linux的文件能否找到文件的创建时间取决于文件系统类型,在ext4之前的早期文件系统中(ext.ext2.ext3),文件的元数据不会记录文件的创建时间,它只会记录访问时间.修改时间.更改时间(状态更改时间).典型的文件的基础信息如下所示: [root@bugwz -]# stat test.file File: 'test.file' Size: 2 Blocks: 8 IO Block: 4096 regular file Device: 807h/2055d Inode: 52

  • Linux Shell获取文件夹下的文件名方法

    有时候需要获取某个文件夹下的所有文件名,可以用程序实现,但是打开IDE,编译运行太麻烦,在Linux服务器中通常不能打开IDE,此时可以用几行简单的shell命令来实现,结果保存到某个文件中即可. Shell脚本如下: #!/bin/bash # get all filename in specified path path=$1 files=$(ls $path) for filename in $files do echo $filename >> filename.txt done 以上

  • Linux 下各个文件夹的结构说明及用途介绍(超详细)

    linux下各文件夹的结构说明及用途介绍: 下面给大家分享下 linux下各文件夹的结构说明及用途介绍--电子版 /bin:二进制可执行命令. /dev:设备特殊文件. /etc:系统管理和配置文件. /etc/rc.d:启动的配 置文件和脚本. /home:用户主目录的基点,比如用户user的主目录就是/home/user,可以用~user表示. /lib:标准程序设计库,又 叫动态链接共享库,作用类似windows里的.dll文件. /sbin:系统管理命令,这 里存放的是系统管理员使用的管

  • 详解Linux下的文件标述符和文件指针

       Linux下的文件标述符和文件指针 文件标识符: 首先我们来了解一下文件标识符是什么东西? 文件描述符是计算机科学中的一个术语,是一个用于表述只想文件的引用的抽象化概念. 在linux当中,每个进程会在进程控制块(PCB)当中保存着一份文件描述符表,文件描述符就是这个表的索引,每个表都有一个指 向已经打开文件的指针. 每个linux进程都应该有三个标准的文件描述符,对应三个标准流. 整数值 名称 (unistd.h)符号常量 (stdio.h)文件流 0 Standard input ST

  • LINUX下Oracle数据库用户创建方法详解

    本文实例分析了LINUX下Oracle数据库用户创建方法.分享给大家供大家参考,具体如下: 1)登录linux,以oracle用户登录(如果是root用户登录的,登录后用 su - oracle命令切换成oracle用户) 2)首先要打开监听器命令如下:lsnrctl start,然后sqlplus /nolog ,然后conn /as sysdba,然后startup(这一部分命令是用来打开oracle数据库) 3)查看我们常规将用户表空间放置的位置:执行如下sql: SQL> select

  • linux下判断文件和目录是否存在的方法(总结)

    1.前言 工作中涉及到文件系统,有时候需要判断文件和目录是否存在.我结合APUE第四章文件和目录,总结一下如何正确判断文件和目录是否存在,方便以后查询. 2.stat系列函数 stat函数用来返回与文件有关的结构信息.stat系列函数有三种情况,分别对应文件名称.文件描述符和符号链接文件.stat结构描述了文件的属性,主要包括文件的类型.文件大小等等.详细stat结构如下所示: struct stat { mode_t st_mode; // file type & mode(permissio

  • Linux下date命令,格式化输出,时间设置方法

    date命令的帮助信息 [root@localhost source]# date --help 用法:date [选项]... [+格式] 或:date [-u|--utc|--universal] [MMDDhhmm[[CC]YY][.ss]] 以给定的格式显示当前时间,或是设置系统日期. -d,--date=字符串 显示指定字符串所描述的时间,而非当前时间 -f,--file=日期文件 类似--date,从日期文件中按行读入时间描述 -r, --reference=文件 显示文件指定文件的

随机推荐