修改文件时间与创建新文件:touch

来源:互联网 发布:大数据的三个哲学问题 编辑:程序博客网 时间:2024/06/06 16:40

修改文件时间与创建新文件:touch

from cnbird2008的专栏

7.3.5  修改文件时间与创建新文件:touch

在介绍ls命令时,提到每个文件在Linux下面都会记录3个主要的修改时间: • modification time(mtime,修改时间):当该文件的"内容数据"更改时,就会更新这个时间。内容数据指的是文件的内容,而不是文件的属性。

 • status time(ctime,状态时间):当该文件的"状态(status)"改变时,就会更新这个时间,举例来说,更改了权限与属性,就会更新这个时间。

 • access time(atime,存取时间):当"取用文件内容"时,就会更新这个读取时间。举例来说,使用cat去读取 ~/.bashrc,就会更新atime了。

举例来说,我们来看一看/etc/man.config文件的时间。

[root@linux ~]# ls -l /etc/man.config
-rw-r--r--  1 root root 4506 Apr  8 19:11 /etc/man.config
[root@linux ~]# ls -l --time=atime /etc/man.config
-rw-r--r--  1 root root 4506 Jul 19 17:53 /etc/man.config
[root@linux ~]# ls -l --time=ctime /etc/man.config
-rw-r--r--  1 root root 4506 Jun 25 08:28 /etc/man.config

看到了吗?在默认的情况下,ls显示的是该文件的mtime,也就是这个文件的内容上次更改的时间。我的系统是在6/25安装的,因此,这个文件产生但状态更改的时间就回溯到那个时间点。因为刚才的范例中使用到这个文件,所以,它的atime就会变成刚刚使用的时间了。

文件的时间很重要,因为如果误判文件时间,可能会造成某些程序无法顺利运行。那么,万一我发现了一个文件来自将来(很多时候会有这个问题的。我们在安装的时候,提到的GMT时间就是那个意思),该如何让该文件的时间变成"现在"的时刻呢?很简单,用touch命令即可。

 

[root@linux ~]# touch [-acdmt] 文件
参数:
-a : 仅修改access time。
-c : 仅修改时间,而不建立文件。
-d : 后面可以接日期,也可以使用 --date="日期或时间"
-m : 仅修改mtime。
-t : 后面可以接时间,格式为 [YYMMDDhhmm]
范例:

范例一:新建一个空的文件。

[root@linux ~]# cd /tmp

[root@linux tmp]# touch testtouch

[root@linux tmp]# ls -l testtouch

-rw-r--r--  1 root root    0 Jul 19 20:49 testtouch

# 注意,这个文件的大小是0。在默认的状态下,如果touch后面接文件,

# 则该文件的3个时间(atime/ctime/mtime)都会更新为当前时间。若该文件不存在,

# 则会主动建立一个新的空文件。例如上面这个例子。

范例二:将 ~/.bashrc复制成为bashrc,假设复制完全的属性,检查其日期。

[root@linux tmp]# cp ~/.bashrc bashrc

[root@linux tmp]# ll bashrc; ll --time=atime bashrc; ll --time=ctime bashrc

-rwxr-xr-x  1 root root 395 Jul  4 11:45 bashrc  <==这是mtime

-rwxr-xr-x  1 root root 395 Jul 19 20:44 bashrc  <==这是atime

-rwxr-xr-x  1 root root 395 Jul 19 20:53 bashrc  <==这是ctime

# 在这个案例中,我们使用了 ; 命令分隔符,它的用法我们会在Bash shell中提到。

# 此外,ll是ls -l的命令别名,这个也会在bash shell中再次提及,

# 当前可以简单地想成,ll就是ls -l的简写。至于 ; 则是同时发出两个命令,

# 且让两个命令"按顺序"执行的意思。上面的结果中可以看到,该文件更改的日期

# Jul 4 11:45,但是atime与ctime不一样。

范例三:修改案例二的bashrc文件,将日期调整为两天前。

[root@linux tmp]# touch -d "2 days ago" bashrc

[root@linux tmp]# ll bashrc; ll --time=atime bashrc; ll --time=ctime bashrc

-rwxr-xr-x  1 root root 395 Jul 17 21:02 bashrc

-rwxr-xr-x  1 root root 395 Jul 17 21:02 bashrc

-rwxr-xr-x  1 root root 395 Jul 19 21:02 bashrc

# 与上一个范例比较,本来是19日的变成了17日了(atime/mtime)。

# 不过,ctime并没有跟着改变。

范例四:将上个范例的bashrc日期改为2005/07/15 2:02。

[root@linux tmp]# touch -t 0507150202 bashrc

[root@linux tmp]# ll bashrc; ll --time=atime bashrc; ll --time=ctime bashrc

-rwxr-xr-x  1 root root 395 Jul 15 02:02 bashrc

-rwxr-xr-x  1 root root 395 Jul 15 02:02 bashrc

-rwxr-xr-x  1 root root 395 Jul 19 21:05 bashrc

# 注意,日期在atime与mtime都改变了,但ctime则是记录当前的时间。

 

通过touch命令,可以轻松地修改文件的日期与时间。并且,也可以建立一个空文件。

不过,要注意的是,即使复制一个文件,复制所有属性,但也没有办法复 制ctime属性。

ctime可以记录文件最近改变状态(status)的时间。

无论如何,还是要说明一下,我们平时看的文件属性中,比较重要的还是 mtime。我们关心的常常是这个文件的"内容"是什么时候更改的。 touch这个命令最常用的情况是: • 建立一个空文件。 • 将某个文件日期修改为当前日期(mtime与atime)。

如何用touch命令修改文件change时间: 比如要把,change:2004-10-09 20:20:20 000000000 +0800    改成: change:2005-11-11 22:22:22 000000000 +0800 要如何运用touch?

 (1). touch 文件名如果该文件存在,会将当前的系统时钟赋予该文件

 (2). 生成当前的时间: $ touch test.txt 任意时间: $ touch -d "May 25 3:51 pm" test.txt $ ls -l test.txt 或 $ touch -t 05251551 test.txt

touch命令很常用,但是有些参数总是记不住。最近几天在看日志的时候,发现实际上能够用touch修改系统时间戳,销毁一些证据。 用途 更新文档的访问和修改时间。

 语法 touch [   -a ] [   -c ] [   -m ] [   -f ] [   -r RefFile ] [ Time |   -t Time ] { File ... | Directory ... }

 

描述 touch 命令更新由 Directory 参数指定的每个目录下的由 File 参数指定的每个文档的访问和修改时间。假如没有指定 Time 变量值,touch 命令就使用当前时间。假如指定了一个不存在的文档,touch 命令就创建此文档,除非指定了 -c 标志。 touch 命令的返回码是时间没有被成功修改的文档数目(包括不存在的文档和没有创建的文档)。 注: 任何超出 2038 年(包含2038年)的日期都是无效的。

 

 标志 -a 更改由 File 变量指定的文档的访问时间。

不要更改修改时间,除非也指定了 -m 标志

 -c 假如文档不存在,则不要进行创建。没有写任何有关此条件的诊断消息。

 -f 尝试强制 touch 运行,而不管文档的读和写许可权。 -m 更改 File 的修改时间。不要更改访问时间,除非也指定了 -m 标志。

 -r RefFile 使用由 RefFile 变量指定的文档的相应时间,而不用当前时间。

 

Time 以 MMDDhhmm[YY] 的格式指定新时间戳记的日期和时间,其中: MM 指定一年的哪一月(从 01 到 12)。 DD 指定一月的哪一天(从 01 到 31)。 hh 指定一天中的哪一小时(从 00 到 23)。 mm 指定一小时的哪一分钟(从 00 到 59)。 YY 指定年份的后两位数字。假如 YY 变量没有被指定,缺省值为当前年份。 -t Time 使用指定时间而不是当前时间。Time 变量以十进制形式 [[CC]YY]MMDDhhmm[.SS] 指定,其中: CC 指定年份的前两位数字。 YY 指定年份的后两位数字。 MM 指定一年的哪一月(从 01 到 12)。 DD 指定一月的哪一天(从 01 到 31)。 hh 指定一天中的哪一小时(从 00 到 23)。 mm 指定一小时的哪一分钟(从 00 到 59)。 SS 指定一分钟的哪一秒(从 00 到 59)。

 

 注:

  touch 命令调用 utime () 子例程来更改所涉及文档的修改和访问时间。当没有真正拥有该文档,即使对文档有写许可权,使用标志时也可能使 touch 命令失败。

 

  当使用 touch 命令时,假如接收到错误消息,不要指定完整路径名 /usr/bin/touch。 退出状态 命令返回以下出口值: 0 命令成功执行。任何请求的更改已完成。 >0 发生一个错误。 示例

  要更新文档的访问和修改时间,请输入: touch program。c 这会将 program.c 文档的上次访问和修改时间配置为当前日期和时间。假如 program.c 文档不存在,touch 命令就创建一个同名的空文档。

 

  要避免创建新文档,请输入: touch   -c program.c

 

  要仅更新修改时间,请输入: touch   -m *.o 这会更新当前目录下的以 .o 扩展名结尾的文档的上次修改时间(不更新访问时间)。touch 命令经常以此方式使用,来改变 make 命令的结果。

 

  要明确配置访问和修改时间,请输入: touch   -c -t 02171425 program.c 这会将访问和修改时间配置为当前年份的 2 月 17 日的 14:25(2:25 p.m.)。

 

  要使用另一文档的时间戳记而不用当前时间,请输入: touch   -r file1 program.c 这会将 program.c 文档的时间戳记配置成和 file1 文档相同。

 

  要使用指定时间而不是当前时间处理文档,请输入: touch   -t 198503030303.55 program.c 这会将 program.c 文档的时间戳记配置为 1985 年 3 月 3 日上午 3:03:55。

原创粉丝点击