您的位置:首页 > 其它

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

2009-05-14 17:43 316 查看

修改文件时间与创建新文件: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。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: