加载中…
个人资料
  • 博客等级:
  • 博客积分:
  • 博客访问:
  • 关注人气:
  • 获赠金笔:0支
  • 赠出金笔:0支
  • 荣誉徽章:
正文 字体大小:

Shell脚本 touch命令解析

(2013-04-13 00:23:38)
标签:

it

shell

分类: Shell脚本
:-),jonas今天来介绍一下touch命令,该命令有些有趣的用途,比如修改文件时间戳
  1. 最后访问时间:(Access Time,atime)
  2. 最后修改文件时间:(Modify Time,mtime)
  3. 最后修改inode的时间:(Change Time,ctime)
  4. 文件创建时间:(Birth Time,部分系统支持)
先来看一下touch的语法

touch [OPTION]... FILE...

如果FILE不存在并且没有指定参数--no-create--no-dereference就会创建一个空的文件。在用户不拥有文件,但是具有写入和运行的权利时,touch就可以同时修改访问和修改文件的时间戳,否则用户想要修改文件时间戳需要拥有文件。

什么叫做修改inode的时间戳,这个时间戳是做什么用的呢?atimemtime主要针对文件的内容数据,但是文件本身也有数据,比如允许访问,文件名等,所以ctime域就是用于记录修改文件元数据(meta-time)的时间戳。

时间戳假定时区规则由名为TZ的环境变量定义或者由系统默认定义(如果不存在名为TZ的环境变量定义)。

利用stat命令查看文件的各个属性。

示例1:

先创建一个新文件
jonas@jonas-ID43A:~/Documents$ touch aim
jonas@jonas-ID43A:~/Documents$ stat aim
  File: `aim'
  Size: 0         Blocks: 0          IO Block: 4096   regular empty file
Device: 805h/2053d Inode: 265526      Links: 1
Access: (0664/-rw-rw-r--)  Uid: ( 1000/   jonas)   Gid: ( 1000/   jonas)
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
 Birth: -

2013-04-12 23:02:23.064736891 +0800:年-月-日 时:分:秒.毫秒  -/+xxxx
最后-表示西区,+表示东区,+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
  File: `aim'
  Size: 0         Blocks: 0          IO Block: 4096   regular empty file
Device: 805h/2053d Inode: 265526      Links: 1
Access: (0664/-rw-rw-r--)  Uid: ( 1000/   jonas)   Gid: ( 1000/   jonas)
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
 Birth: -

由于时间戳被修改了,所以认为是文件元数据被修改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
  File: `aim'
  Size: 0         Blocks: 0          IO Block: 4096   regular empty file
Device: 805h/2053d Inode: 265526      Links: 1
Access: (0664/-rw-rw-r--)  Uid: ( 1000/   jonas)   Gid: ( 1000/   jonas)
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
 Birth: -

jonas@jonas-ID43A:~/Documents$ touch -d 11:00 am aim
jonas@jonas-ID43A:~/Documents$ stat aim
  File: `aim'
  Size: 0         Blocks: 0          IO Block: 4096   regular empty file
Device: 805h/2053d Inode: 265526      Links: 1
Access: (0664/-rw-rw-r--)  Uid: ( 1000/   jonas)   Gid: ( 1000/   jonas)
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
 Birth: -

jonas@jonas-ID43A:~/Documents$ touch -d 2013-04-10 1:20:41.982138690 +0500 aim
jonas@jonas-ID43A:~/Documents$ stat aim
  File: `aim'
  Size: 0         Blocks: 0          IO Block: 4096   regular empty file
Device: 805h/2053d Inode: 265526      Links: 1
Access: (0664/-rw-rw-r--)  Uid: ( 1000/   jonas)   Gid: ( 1000/   jonas)
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
 Birth: -

4. -h --no-dereference:只修改符号链接(快捷方式)的时间戳,而不修改链接指向的文件。
该参数在文件不存在的情况下不会创建新文件,利用-c参数可以避免给出警告,并且该参数并不是在所有系统上都支持,有的系统上支持不完全。

创建一个链接文件
jonas@jonas-ID43A:~/Documents$ ln -s aim aimlk
jonas@jonas-ID43A:~/Documents$ stat aimlk
  File: `aimlk' -> `aim'
  Size: 3         Blocks: 0          IO Block: 4096   symbolic link
Device: 805h/2053d Inode: 265471      Links: 1
Access: (0777/lrwxrwxrwx)  Uid: ( 1000/   jonas)   Gid: ( 1000/   jonas)
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
 Birth: -
 jonas@jonas-ID43A:~/Documents$ stat aim
  File: `aim'
  Size: 0         Blocks: 0          IO Block: 4096   regular empty file
Device: 805h/2053d Inode: 265526      Links: 1
Access: (0664/-rw-rw-r--)  Uid: ( 1000/   jonas)   Gid: ( 1000/   jonas)
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
 Birth: -

直接对符号链接使用touch不会改变符号链接的时间戳,而会改变目标文件的时间戳(这里jonas做了一些实验所以时间戳可能有点对不上)
jonas@jonas-ID43A:~/Documents$ touch aimlk
jonas@jonas-ID43A:~/Documents$ stat aimlk
  File: `aimlk' -> `aim'
  Size: 3         Blocks: 0          IO Block: 4096   symbolic link
Device: 805h/2053d Inode: 265471      Links: 1
Access: (0777/lrwxrwxrwx)  Uid: ( 1000/   jonas)   Gid: ( 1000/   jonas)
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
 Birth: -
jonas@jonas-ID43A:~/Documents$ stat aim
  File: `aim'
  Size: 0         Blocks: 0          IO Block: 4096   regular empty file
Device: 805h/2053d Inode: 265526      Links: 1
Access: (0664/-rw-rw-r--)  Uid: ( 1000/   jonas)   Gid: ( 1000/   jonas)
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
 Birth: -

添加参数-h之后只改变符号链接的时间戳,而不是目标文件的时间戳
jonas@jonas-ID43A:~/Documents$ touch -h aimlk
jonas@jonas-ID43A:~/Documents$ stat aim
  File: `aim'
  Size: 0         Blocks: 0          IO Block: 4096   regular empty file
Device: 805h/2053d Inode: 265526      Links: 1
Access: (0664/-rw-rw-r--)  Uid: ( 1000/   jonas)   Gid: ( 1000/   jonas)
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
 Birth: -
jonas@jonas-ID43A:~/Documents$ stat aimlk
  File: `aimlk' -> `aim'
  Size: 3         Blocks: 0          IO Block: 4096   symbolic link
Device: 805h/2053d Inode: 265471      Links: 1
Access: (0777/lrwxrwxrwx)  Uid: ( 1000/   jonas)   Gid: ( 1000/   jonas)
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
 Birth: -

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
  File: `aim.sh'
  Size: 17         Blocks: 8          IO Block: 4096   regular file
Device: 805h/2053d Inode: 269610      Links: 1
Access: (0664/-rw-rw-r--)  Uid: ( 1000/   jonas)   Gid: ( 1000/   jonas)
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
 Birth: -
jonas@jonas-ID43A:~/Documents$ touch -r aim.sh aim
jonas@jonas-ID43A:~/Documents$ stat aim
  File: `aim'
  Size: 0         Blocks: 0          IO Block: 4096   regular empty file
Device: 805h/2053d Inode: 265526      Links: 1
Access: (0664/-rw-rw-r--)  Uid: ( 1000/   jonas)   Gid: ( 1000/   jonas)
Access: 2013-04-09 16:42:07.727655374 +0800
Modify: 2013-04-09 16:41:23.111655528 +0800
Change: 2013-04-13 00:01:28.120724647 +0800
 Birth: -

与-d参数结合
jonas@jonas-ID43A:~/Documents$ touch -r aim.sh -d '-10 hour' aim
jonas@jonas-ID43A:~/Documents$ stat aim
  File: `aim'
  Size: 0         Blocks: 0          IO Block: 4096   regular empty file
Device: 805h/2053d Inode: 265526      Links: 1
Access: (0664/-rw-rw-r--)  Uid: ( 1000/   jonas)   Gid: ( 1000/   jonas)
Access: 2013-04-09 06:42:07.727655374 +0800
Modify: 2013-04-09 06:41:23.111655528 +0800
Change: 2013-04-13 00:04:27.368724029 +0800
 Birth: -

利用-h参数直接使用符号链接的时间戳
jonas@jonas-ID43A:~/Documents$ stat aim
  File: `aim'
  Size: 0         Blocks: 0          IO Block: 4096   regular empty file
Device: 805h/2053d Inode: 265526      Links: 1
Access: (0664/-rw-rw-r--)  Uid: ( 1000/   jonas)   Gid: ( 1000/   jonas)
Access: 2013-04-09 06:42:07.727655374 +0800
Modify: 2013-04-09 06:41:23.111655528 +0800
Change: 2013-04-13 00:04:27.368724029 +0800
 Birth: -
jonas@jonas-ID43A:~/Documents$ touch -hr aimlk aim
jonas@jonas-ID43A:~/Documents$ stat aim
  File: `aim'
  Size: 0         Blocks: 0          IO Block: 4096   regular empty file
Device: 805h/2053d Inode: 265526      Links: 1
Access: (0664/-rw-rw-r--)  Uid: ( 1000/   jonas)   Gid: ( 1000/   jonas)
Access: 2013-04-12 23:46:55.576727662 +0800
Modify: 2013-04-12 23:46:51.368727677 +0800
Change: 2013-04-13 00:06:11.960723666 +0800
 Birth: -

7. -t [[CC]YY]MMDDHHMM[.SS]:以指定时间替换当前时间,当年份只有2位数时,YY在[0, 68]之间CC为20,YY在[69, 99]之间CC 为19,当没有年份被指定时,默认为当前年份。注意由于瑞年的存在,SS可能为60.

touch命令就介绍到这里,有错的地方还请指出。




0

阅读 收藏 喜欢 打印举报/Report
  

新浪BLOG意见反馈留言板 欢迎批评指正

新浪简介 | About Sina | 广告服务 | 联系我们 | 招聘信息 | 网站律师 | SINA English | 产品答疑

新浪公司 版权所有