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_atime、st_mtime、st_ctime的其他任何一个成员的值改变了,Modify Time也就随之更新。看下面这个例子:
由于文件的所有者更改成了root,所以元数据发生变化,Change Time更新。