【Linux】touch

我们在介绍ls这个命令时,提到每个文件在Linux下面都会记录许多的时间参数,其实是有三个主要的变动时间,那么三个时间的意义是什么?

  1. 修改时间(modification time,mtime):当该文件的【内容数据】变更时,就会更新这个时间,内容数据指的是文件的内容,而不是文件的属性或权限。
  2. 状态时间(status time,ctime ):当该文件的【状态(status)】改变时,就会更新这个时间,举例来说,像是权限与属性被更改了,都会更新这个时间。
  3. 读取时间(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文件

选项与参数:

  1. -a:仅自定义 access time;
  2. -c:仅修改文件的时间,若该文件不存在则不建立新文件;
  3. -d:后面可以接欲自定义的日期而不用目前的日期,也可以使用--date="日期或时间";
  4. -m:仅修改mtime;
  5. -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这个命令最常被使用的情况是:

  1. 建立一个空文件;
  2. 将某个文件日期自定义为目前(mtime与atime)。
相关推荐
艾伦_耶格宇27 分钟前
【ELK】-4 logstash的搭建及操作
linux·运维·ubuntu·elk
Lam Tang42 分钟前
APS 系列文章 08
java·代理模式
mifengxing1 小时前
文件逻辑结构、物理结构与磁盘空闲存储空间管理
大数据·linux·运维·操作系统·计算机408
萧瑟余晖1 小时前
Java深入解析篇三十三之消息队列
java·开发语言
码匠许师傅1 小时前
【C++ 面试真题】聊聊 C++ 的序列容器
java·c++·面试
IT爱学堂2 小时前
尚硅谷Java+AI大模型应用开发革新版本 2025年3月
java·开发语言·人工智能
xcLeigh2 小时前
Go入门:无类型常量与类型常量的区别
服务器·开发语言·golang
不爱编程的小九九2 小时前
小九源码-springboot004-springboot智能阅读推荐系统
java·spring boot·后端
SCandL1523 小时前
Docker的实战应用
java·docker·容器
AC赳赳老秦3 小时前
OpenClaw 多源采集公开行业数据:从原始信息到研究报告初稿的自动化实践
java·c语言·c++·python·php·deepseek·openclaw