关于Linux中的指令:touch
关于Linux的命令:touch。
通常,我们都认为该命令是用来创建一个新的文件的,并且我们也是按照这样的方式操作的,如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
[root@LinuxService ~]# ll total 68 -rw------- 1 root root 885 Jan 12 19:33 anaconda-ks.cfg drwxr-xr-x 2 root root 4096 Jan 12 11:41 Desktop -rw-r--r-- 1 root root 36679 Jan 12 19:32 install.log -rw-r--r-- 1 root root 4038 Jan 12 19:31 install.log.syslog -rw-r--r-- 1 root root 12 Jan 23 10:46 touch_change_date [root@LinuxService ~]# touch me [root@LinuxService ~]# ll total 68 -rw------- 1 root root 885 Jan 12 19:33 anaconda-ks.cfg drwxr-xr-x 2 root root 4096 Jan 12 11:41 Desktop -rw-r--r-- 1 root root 36679 Jan 12 19:32 install.log -rw-r--r-- 1 root root 4038 Jan 12 19:31 install.log.syslog -rw-r--r-- 1 root root 0 Jan 23 10:47 me -rw-r--r-- 1 root root 12 Jan 23 10:46 touch_change_date [root@LinuxService ~]# |
上面的SHELL LOG中,我通过“touch me”创建了一个新的空文件:me。
但事实上,这种对于“touch”的理解是一种误解。
通过“man touch”,你可以看到对于“touch”的定义:
touch – change file timestamps
可以看到,该命令的初衷是修改某个文件的时间戳的。
在Linux中,一个文件有三个时间:
atime,Access Time
mtime,Modified Time
ctime,Change Time
atime记录的是文件最后一次被访问的时间,它会在访问文件的操作出发时被改变。
mtine记录的是文件的内容最后一次被修改的时间。
ctime记录的是文件的属性(元信息)最后一次被改变的时间。
因此,
在对一个文件做访问的时候,会影响atime。
如果变更了文件的内容,会影响atime、mtime。
如果(只是)变更了文件的属性,会影响ctime。
通常,“ls -l”或者“ll”命令,查看到的时间是ctime的值。
某个文件的以上三种时间属性,可以通过以下方式获取:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
[root@LinuxService ~]# ll total 68 -rw------- 1 root root 885 Jan 12 19:33 anaconda-ks.cfg drwxr-xr-x 2 root root 4096 Jan 12 11:41 Desktop -rw-r--r-- 1 root root 36679 Jan 12 19:32 install.log -rw-r--r-- 1 root root 4038 Jan 12 19:31 install.log.syslog -rw-r--r-- 1 root root 0 Jan 23 10:47 me -rw-r--r-- 1 root root 12 Jan 23 10:46 touch_change_date [root@LinuxService ~]# [root@LinuxService ~]# stat install.log File: `install.log' Size: 36679 Blocks: 80 IO Block: 4096 regular file Device: 802h/2050d Inode: 3440642 Links: 1 Access: (0644/-rw-r--r--) Uid: ( 0/ root) Gid: ( 0/ root) Access: 2015-01-12 19:22:49.000000000 +0800 Modify: 2015-01-12 19:32:57.000000000 +0800 Change: 2015-01-12 19:33:19.000000000 +0800 [root@LinuxService ~]# |
时间属性,即上述Shell Log中的:Access、Modify、Change,对应的值。
当然,也可以通过“ls”命令的参数查看到以上三种时间属性,如下:
1 2 3 4 5 6 7 8 9 10 |
[root@LinuxService ~]# ls -lu install.log -rw-r--r-- 1 root root 36679 Jan 12 19:22 install.log [root@LinuxService ~]# [root@LinuxService ~]# ls -l install.log -rw-r--r-- 1 root root 36679 Jan 12 19:32 install.log [root@LinuxService ~]# [root@LinuxService ~]# ls -lc install.log -rw-r--r-- 1 root root 36679 Jan 12 19:33 install.log [root@LinuxService ~]# [root@LinuxService ~]# |
说明:
Access:ls -lu
Modify:ls -l
Change:ls -lc
而“touch”设计的初衷便是修改这三个时间属性的值,并非大家误以为的创建一个新的空文件。
用“touch”修改时间属性:
修改:Access Time。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
[root@LinuxService ~]# stat install.log File: `install.log' Size: 36679 Blocks: 80 IO Block: 4096 regular file Device: 802h/2050d Inode: 3440642 Links: 1 Access: (0644/-rw-r--r--) Uid: ( 0/ root) Gid: ( 0/ root) Access: 2015-01-12 19:22:49.000000000 +0800 Modify: 2015-01-12 19:32:57.000000000 +0800 Change: 2015-01-12 19:33:19.000000000 +0800 [root@LinuxService ~]# [root@LinuxService ~]# touch -a -t 200305221428.34 install.log [root@LinuxService ~]# [root@LinuxService ~]# stat install.log File: `install.log' Size: 36679 Blocks: 80 IO Block: 4096 regular file Device: 802h/2050d Inode: 3440642 Links: 1 Access: (0644/-rw-r--r--) Uid: ( 0/ root) Gid: ( 0/ root) Access: 2003-05-22 14:28:34.000000000 +0800 Modify: 2015-01-12 19:32:57.000000000 +0800 Change: 2015-01-23 11:48:02.000000000 +0800 [root@LinuxService ~]# |
修改:Modify Time。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
[root@LinuxService ~]# stat install.log File: `install.log' Size: 36679 Blocks: 80 IO Block: 4096 regular file Device: 802h/2050d Inode: 3440642 Links: 1 Access: (0644/-rw-r--r--) Uid: ( 0/ root) Gid: ( 0/ root) Access: 2003-05-22 14:28:34.000000000 +0800 Modify: 2015-01-12 19:32:57.000000000 +0800 Change: 2015-01-23 11:48:02.000000000 +0800 [root@LinuxService ~]# [root@LinuxService ~]# touch -m -t 201211030815.58 install.log [root@LinuxService ~]# [root@LinuxService ~]# stat install.log File: `install.log' Size: 36679 Blocks: 80 IO Block: 4096 regular file Device: 802h/2050d Inode: 3440642 Links: 1 Access: (0644/-rw-r--r--) Uid: ( 0/ root) Gid: ( 0/ root) Access: 2003-05-22 14:28:34.000000000 +0800 Modify: 2012-11-03 08:15:58.000000000 +0800 Change: 2015-01-23 11:49:37.000000000 +0800 [root@LinuxService ~]# |
仅修改时间而不创建文件:
如果文件存在的情况下,你会看到如下情况:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
[root@LinuxService ~]# stat install.log File: `install.log' Size: 36679 Blocks: 80 IO Block: 4096 regular file Device: 802h/2050d Inode: 3440642 Links: 1 Access: (0644/-rw-r--r--) Uid: ( 0/ root) Gid: ( 0/ root) Access: 2003-05-22 14:28:34.000000000 +0800 Modify: 2012-11-03 08:15:58.000000000 +0800 Change: 2015-01-23 11:49:37.000000000 +0800 [root@LinuxService ~]# [root@LinuxService ~]# touch -c -t 201409081123.13 install.log [root@LinuxService ~]# [root@LinuxService ~]# stat install.log File: `install.log' Size: 36679 Blocks: 80 IO Block: 4096 regular file Device: 802h/2050d Inode: 3440642 Links: 1 Access: (0644/-rw-r--r--) Uid: ( 0/ root) Gid: ( 0/ root) Access: 2014-09-08 11:23:13.000000000 +0800 Modify: 2014-09-08 11:23:13.000000000 +0800 Change: 2015-01-23 11:50:45.000000000 +0800 [root@LinuxService ~]# [root@LinuxService ~]# |
如果文件不存在,你会看到如下情况:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
[root@LinuxService ~]# ll total 68 -rw------- 1 root root 885 Jan 12 19:33 anaconda-ks.cfg drwxr-xr-x 2 root root 4096 Jan 12 11:41 Desktop -rw-r--r-- 1 root root 36679 Sep 8 11:23 install.log -rw-r--r-- 1 root root 4038 Jan 12 19:31 install.log.syslog -rw-r--r-- 1 root root 0 Jan 23 10:47 me -rw-r--r-- 1 root root 12 Jan 23 10:46 touch_change_date [root@LinuxService ~]# [root@LinuxService ~]# touch -c -t 201409081123.13 file_is_not_exist.file [root@LinuxService ~]# [root@LinuxService ~]# ll total 68 -rw------- 1 root root 885 Jan 12 19:33 anaconda-ks.cfg drwxr-xr-x 2 root root 4096 Jan 12 11:41 Desktop -rw-r--r-- 1 root root 36679 Sep 8 11:23 install.log -rw-r--r-- 1 root root 4038 Jan 12 19:31 install.log.syslog -rw-r--r-- 1 root root 0 Jan 23 10:47 me -rw-r--r-- 1 root root 12 Jan 23 10:46 touch_change_date [root@LinuxService ~]# [root@LinuxService ~]# |
可以看到“touch”,并不是为了创建新的空文件而诞生的指令。
关于ctime,由于上面命令修改了文件本身的时间属性,所以属于变更了文件的元信息,故而,ctime的值为改变时的当前时间。
touch之所以会默认创建一个给定名称的新文件,是因为,在早期,如果提供的目标文件的参数给定的目标文件不存在的时候,touch会出现异常。
所以,touch默认让用户创建新文件,再后来,由于用户养成了创建新文件就会想到“touch”,故而,这种功能被延续下来了。
——————————————————————————————————————————
Finished。