Shell脚本 touch命令解析
(2013-04-13 00:23:38)
标签:
itshell |
分类: Shell脚本 |
:-),jonas今天来介绍一下touch命令,该命令有些有趣的用途,比如修改文件时间戳
- 最后访问时间:(Access Time,atime)
- 最后修改文件时间:(Modify Time,mtime)
- 最后修改inode的时间:(Change Time,ctime)
- 文件创建时间:(Birth Time,部分系统支持)
touch [OPTION]... FILE...
如果FILE不存在并且没有指定参数--no-create或--no-dereference就会创建一个空的文件。在用户不拥有文件,但是具有写入和运行的权利时,touch就可以同时修改访问和修改文件的时间戳,否则用户想要修改文件时间戳需要拥有文件。
什么叫做修改inode的时间戳,这个时间戳是做什么用的呢?atime和mtime主要针对文件的内容数据,但是文件本身也有数据,比如允许访问,文件名等,所以ctime域就是用于记录修改文件元数据(meta-time)的时间戳。
时间戳假定时区规则由名为TZ的环境变量定义或者由系统默认定义(如果不存在名为TZ的环境变量定义)。
利用stat命令查看文件的各个属性。
示例1:
先创建一个新文件
jonas@jonas-ID43A:~/Documents$ touch aim
jonas@jonas-ID43A:~/Documents$ stat aim
Device: 805h/2053d Inode: 265526
Access: (0664/-rw-rw-r--)
Access: 2013-04-12 23:02:23.064736891 +0800
Modify: 2013-04-12 23:02:23.064736891 +0800
Change: 2013-04-12 23:02:23.064736891 +0800
2013-04-12 23:02:23.064736891 +0800:年-月-日 时:分:秒.毫秒
最后-表示西区,+表示东区,+0800表示东8区,也可以认为0时区时间加上8个小时0分钟。
有以上可知Birth并没有值所以jonas的系统看来并不支持该时间戳。
1. -a --time=atime --time=access --time=use:修改文件最后访问时间。
示例2:
jonas@jonas-ID43A:~/Documents$ touch -a aim
jonas@jonas-ID43A:~/Documents$ stat aim
Device: 805h/2053d Inode: 265526
Access: (0664/-rw-rw-r--)
Access: 2013-04-12 23:16:54.304733883 +0800
Modify: 2013-04-12 23:14:17.152734424 +0800
Change: 2013-04-12 23:16:54.304733883 +0800
由于时间戳被修改了,所以认为是文件元数据被修改ctime域随之被修改。
2. -c --no-create:当文件不存在时,不创建新文件也不警告
3. -d --date=TIME:利用TIME代替当前时间,文件时间戳被修改时变成TIME(可以用月份,时区,am,pm和yesterday直接代替),TIME的描述可以使用各种人类可读的形式,如“5 seconds”,“10 hours”,"next thursday"等,具体这部分可以查阅 info date的示例。
示例3:
jonas@jonas-ID43A:~/Documents$ touch -d yesterday aim
jonas@jonas-ID43A:~/Documents$ stat aim
Device: 805h/2053d Inode: 265526
Access: (0664/-rw-rw-r--)
Access: 2013-04-11 23:24:41.982138690 +0800
Modify: 2013-04-11 23:24:41.982138690 +0800
Change: 2013-04-12 23:24:41.976732267 +0800
jonas@jonas-ID43A:~/Documents$ touch -d 11:00 am aim
jonas@jonas-ID43A:~/Documents$ stat aim
Device: 805h/2053d Inode: 265526
Access: (0664/-rw-rw-r--)
Access: 2013-04-12 11:00:00.000000000 +0800
Modify: 2013-04-12 11:00:00.000000000 +0800
Change: 2013-04-12 23:28:32.192731472 +0800
jonas@jonas-ID43A:~/Documents$ touch -d 2013-04-10 1:20:41.982138690 +0500 aim
jonas@jonas-ID43A:~/Documents$ stat aim
Device: 805h/2053d Inode: 265526
Access: (0664/-rw-rw-r--)
Access: 2013-04-10 00:00:00.000000000 +0800
Modify: 2013-04-10 00:00:00.000000000 +0800
Change: 2013-04-12 23:30:21.456731093 +0800
4. -h --no-dereference:只修改符号链接(快捷方式)的时间戳,而不修改链接指向的文件。
该参数在文件不存在的情况下不会创建新文件,利用-c参数可以避免给出警告,并且该参数并不是在所有系统上都支持,有的系统上支持不完全。
创建一个链接文件
jonas@jonas-ID43A:~/Documents$ ln -s aim aimlk
jonas@jonas-ID43A:~/Documents$ stat aimlk
Device: 805h/2053d Inode: 265471
Access: (0777/lrwxrwxrwx)
Access: 2013-04-12 23:33:20.256730477 +0800
Modify: 2013-04-12 23:33:19.064730481 +0800
Change: 2013-04-12 23:33:19.064730481 +0800
Device: 805h/2053d Inode: 265526
Access: (0664/-rw-rw-r--)
Access: 2013-04-10 00:00:00.000000000 +0800
Modify: 2013-04-10 00:00:00.000000000 +0800
Change: 2013-04-12 23:30:21.456731093 +0800
直接对符号链接使用touch不会改变符号链接的时间戳,而会改变目标文件的时间戳(这里jonas做了一些实验所以时间戳可能有点对不上)
jonas@jonas-ID43A:~/Documents$ touch aimlk
jonas@jonas-ID43A:~/Documents$ stat aimlk
Device: 805h/2053d Inode: 265471
Access: (0777/lrwxrwxrwx)
Access: 2013-04-12 23:42:45.048728525 +0800
Modify: 2013-04-12 23:42:32.040728571 +0800
Change: 2013-04-12 23:42:32.040728571 +0800
jonas@jonas-ID43A:~/Documents$ stat aim
Device: 805h/2053d Inode: 265526
Access: (0664/-rw-rw-r--)
Access: 2013-04-12 23:45:24.704727975 +0800
Modify: 2013-04-12 23:45:24.704727975 +0800
Change: 2013-04-12 23:45:24.704727975 +0800
添加参数-h之后只改变符号链接的时间戳,而不是目标文件的时间戳
jonas@jonas-ID43A:~/Documents$ touch -h aimlk
jonas@jonas-ID43A:~/Documents$ stat aim
Device: 805h/2053d Inode: 265526
Access: (0664/-rw-rw-r--)
Access: 2013-04-12 23:45:24.704727975 +0800
Modify: 2013-04-12 23:45:24.704727975 +0800
Change: 2013-04-12 23:45:24.704727975 +0800
jonas@jonas-ID43A:~/Documents$ stat aimlk
Device: 805h/2053d Inode: 265471
Access: (0777/lrwxrwxrwx)
Access: 2013-04-12 23:46:51.368727677 +0800
Modify: 2013-04-12 23:46:51.368727677 +0800
Change: 2013-04-12 23:46:51.368727677 +0800
5. -m --time=mtime --time=modify:只修改最后修改文件时间戳。用法与-a类似不再重复。
6. -r FILE --reference=FILE:
使用FILE的时间戳代替当前时间,如果与--date=TIME结合的话就会将FILE的时间戳作为一个相对的时间点,而TIME作为时间偏移;如果FILE本身是一个符号链接文件,若不指定-h参数则用其目标文件的时间戳,否则使用符号链接本身的时间戳。
(aim.sh创建很早)
jonas@jonas-ID43A:~/Documents$ stat aim.sh
Device: 805h/2053d Inode: 269610
Access: (0664/-rw-rw-r--)
Access: 2013-04-09 16:42:07.727655374 +0800
Modify: 2013-04-09 16:41:23.111655528 +0800
Change: 2013-04-09 16:41:58.967655405 +0800
jonas@jonas-ID43A:~/Documents$ touch -r aim.sh aim
jonas@jonas-ID43A:~/Documents$ stat aim