我们在介绍ls这个命令时,提到每个文件在Linux下面都会记录许多的时间参数,其实是有三个主要的变动时间,那么三个时间的意义是什么?
- 修改时间(modification time,mtime):当该文件的【内容数据】变更时,就会更新这个时间,内容数据指的是文件的内容,而不是文件的属性或权限。
- 状态时间(status time,ctime ):当该文件的【状态(status)】改变时,就会更新这个时间,举例来说,像是权限与属性被更改了,都会更新这个时间。
- 读取时间(access time,atime):当【该文件的内容被读取】时,就会更新这个读取时间(access),
举例来说,我们使用cat去读取/etc/man_db.conf,就会更新该文件的atime。
这是个挺有趣的现象,举例来说,我们来看一看你自己的/etc/man_db.conf这个文件的时间吧
看到了吗?
在默认的情况下,Is显示出来的是该文件的mtime,也就是这个文件的内容上次被修改的时间。
至于我的系统是在2023年6月30号的时候安装,因此,这个文件被产生导致状态被修改的时间就回溯到那个时间点了(ctime)。而还记得刚刚我们使用的范例当中,有使用到man_db.conf这个文件,所以,它的atime 就会变成刚刚使用的时间了。
文件的时间是很重要的,因为,如果文件的时间错误的话,可能会造成某些程序无法顺利的运行。那么万一我发现了一个文件来自未来,该如何让该文件的时间变成【现在】的时刻呢?很简单,就用【touch】这个命令即可。
不要怀疑系统时间会“来自未来”,很多时候会有这个问题。
举例来说,在安装过后系统时间可能会被改变,因为中国时区在国际标准时间“格林威治时间,GMT”的右边,所以会比较早看到阳光,也就是说中国时间比GMT时间快了8小时。如果安装不当,我们的系统可能会快8小时,你的文件就有可能来自8小时后了。
至于某些情况下,由于BIOS的设置错误,导致系统时间跑到未来时间,并且你又建立了某些文件,等你将时间改回正确的时间时,该文件不就变成来自未来了吗?
- touch [-acdmt]文件
选项与参数:
- -a:仅自定义 access time;
- -c:仅修改文件的时间,若该文件不存在则不建立新文件;
- -d:后面可以接欲自定义的日期而不用目前的日期,也可以使用--date="日期或时间";
- -m:仅修改mtime;
- -t:后面可以接欲自定义的时间而不用目前的时间,格式为[YYYYMMDDhhmm];
范例一:新建一个空文件并观察时间。
注意到,这个文件的大小是0.
在默认的状态下,如果touch后面有接文件,则该文件的三个时间(atime/ctime/mtime)都会更新为目前的时间。
若该文件不存在,则会主动的建立一个新的空文件,例如上面这个例子。
范例二:将~/.bashrc复制成为bashrc,假设复制完全的属性,检查其日期。
从上往下依次是目前的时间,mtime,atime,ctime.
执行的结果当中,我们可以发现数据的内容与属性是被复制过来的,因此文件修改时间(mtime)与原本文件相同。但是由于这个文件是刚刚被建立的,因此状态时间(ctime)就变成现在的时间。
那如果你想要变更这个文件的时间?可以这样做:
范例三:修改案例二的bashrc文件,将日期调整为两天前。
#跟上个范例比较看看,本来是 8日变成了6日(atume/mtime)。
不过,ctime 并没有跟着改变。
范例四:将上个范例的bashrc日期改为2014/06/152:02。
注意看看,日期在atime与mtime都改变了,但是ctime则是记录目前的时间
通过touch这个命令,我们可以轻易地自定义文件的日期与时间,并且也可以建立一个空文件。
不过要注意的是,即使我们复制一个文件时,复制所有的属性,但也没有办法复制ctime 这个属性。ctime以记录这个文件最近的状态(status)被改变的时间。
无论如何,还是要告知大家,我们平时看的文件属性中,比较重要的还是mtime。我们关心的常常是这个文件的内容是什么时候被修改,了解了吗?
无论如何,touch这个命令最常被使用的情况是:
- 建立一个空文件;
- 将某个文件日期自定义为目前(mtime与atime)。