stat命令

Linux下的stat命令用于展示一个文件以及当前文件系统的状态,下面是一个实例:

可以看到有一个文件的很多信息,文件名、文件大小、文件系统block大小等等。具体什么是block可以看我这篇博客。注意其中的IO Block就是当前文件系统的块大小(即通常的4096KB),而左边的Blocks并不是说这个文件占了多少个文件系统的块,这里的Blocks是以512Bytes为单位的,所以一个文件系统块正好等于这里的8个Blocks。

重点关注最后的三个时间模样的属性,分别是Access Time、Modify Time、Change Time,这就是Linux文件的三个时间戳。

Access

Access Time表示该文件最后一次被阅读的时间,看如下的例子:

因为我通过cat命令读取了文件的内容,所以文件的Access Time更新了。

Modify

Modify Time表示该文件最后一次内容被修改的时间,看如下的例子:

通过追加重定向向文件中添加了一些内容,文件的内容被修改,于是Modify Time更新。

Change

Change可能在英语里和Modify没啥区别,但这里Change Time表示该文件的元数据最后一次被修改的时间

什么是文件的元数据呢?Stackoverflow下这个问题提到了stat是如何用结构体表示一个文件的:

struct stat {
    dev_t     st_dev;     /* ID of device containing file */
    ino_t     st_ino;     /* inode number */
    mode_t    st_mode;    /* protection */
    nlink_t   st_nlink;   /* number of hard links */
    uid_t     st_uid;     /* user ID of owner */
    gid_t     st_gid;     /* group ID of owner */
    dev_t     st_rdev;    /* device ID (if special file) */
    off_t     st_size;    /* total size, in bytes */
    blksize_t st_blksize; /* blocksize for file system I/O */
    blkcnt_t  st_blocks;  /* number of 512B blocks allocated */
    time_t    st_atime;   /* time of last access */
    time_t    st_mtime;   /* time of last modification */
    time_t    st_ctime;   /* time of last status change */
};

也就是说这个结构体中的成员就是文件所谓的元数据。而只要这个结构体中除了st_atimest_mtimest_ctime的其他任何一个成员的值改变了,Modify Time也就随之更新。看下面这个例子:

由于文件的所有者更改成了root,所以元数据发生变化,Change Time更新。

Last modification:November 11th, 2019 at 10:51 am