一.信息说明
其实写这个东西的朋友应该也很多啦,但是为了让自己更加有映像同时也能按照自己的习惯去看的话,还是自己结合网上各位朋友的写法和自己的理解来写一下咯!稍微废话有点多了,写这个文章主要是因为最近一个备份策略的需求。居然才发现原来touch命令不只是我自己曾经用的那些功能(当然研究下,会发现很多命令都会有这种感觉啊!)。
需求信息:生成一定命名规则的50个文件,且这些文件的最后修改日期为最近50天的每一天。然后再通过find命令去删除30天以前的文件。
二.命令说明
1.ls命令查看时间
通常情况下我们通过ls看到的文件的各种时间,说明如下:
ls -lt:t参数默认表示以最后修改时间排序;ls -lut:u结合lt参数使用表示以最后访问时间排序;ls -ltc:参数c结合lt使用表示按照文件状态最后修改时间排序
2.stat命令
stat命令用来查看文件/文件系统的状态,语法和常用参数如下:
stat [option] ... FILE ...
-f:显示文件系统状态(如果指定文件则为该文件所在文件系统的状态);-t:表示以精简模式显示(如果通过shell编程进行取值会更方便)
范例1:通过touch新建一个文件并查看各个状态
[root@node110 ~]# touch xxx
[root@node110 ~]# stat xxx
File: `xxx'-->文件名
Size: 0 Blocks: 0 IO Block: 4096 regular empty file文件大小(KB) 块数 IO块的大小 文件属性(本例为:普通空文件)
Device: 803h/2051d Inode: 2241272 Links: 1设备编号:十六进制h/十进制d Inode号 硬链接数量
Access: (0644/-rw-r--r--) Uid: ( 0/ root) Gid: ( 0/ root)访问权限 文件所有者的ID及用户名 所在的组ID及组名
Access: 2015-07-11 10:35:26.917403840 +0800文件上次访问时间
Modify: 2015-07-11 10:35:26.917403840 +0800上次文件内容修改时间
Change: 2015-07-11 10:35:26.917403840 +0800上次文件状态变更时间
范例2:cat查看文件引起-atime发生变化:
[root@node110 ~]# cat xxx
[root@node110 ~]# stat xxx
File: `xxx'
Size: 0 Blocks: 0 IO Block: 4096 regular empty file
Device: 803h/2051d Inode: 2241272 Links: 1
Access: (0644/-rw-r--r--) Uid: ( 0/ root) Gid: ( 0/ root)
Access: 2015-07-11 10:35:44.898405321 +0800
Modify: 2015-07-11 10:35:26.917403840 +0800
Change: 2015-07-11 10:35:26.917403840 +0800
范例3:echo写入内容仅引起mtime/ctime发生变化(这种写入不会引起atIme发生变化)
[root@node110 ~]# echo xxx>xxx
[root@node110 ~]# stat xxx
File: `xxx'
Size: 4 Blocks: 8 IO Block: 4096 regular file
Device: 803h/2051d Inode: 2241272 Links: 1
Access: (0644/-rw-r--r--) Uid: ( 0/ root) Gid: ( 0/ root)
Access: 2015-07-11 10:35:44.898405321 +0800
Modify: 2015-07-11 10:36:00.291384045 +0800
Change: 2015-07-11 10:36:00.291384045 +0800
范例4:修改权限引起ctime发生变化
[root@node110 ~]# chmod 777 xxx
[root@node110 ~]# stat xxx
File: `xxx'
Size: 4 Blocks: 8 IO Block: 4096 regular file
Device: 803h/2051d Inode: 2241272 Links: 1
Access: (0777/-rwxrwxrwx) Uid: ( 0/ root) Gid: ( 0/ root)
Access: 2015-07-11 10:35:44.898405321 +0800-->上次访问时间
Modify: 2015-07-11 10:36:00.291384045 +0800-->数据内容发生变化
Change: 2015-07-11 10:39:23.237384355 +0800-->文件状态发生改变
范例5:以-t参数输出简明模式:
[root@node110 ~]# stat -t xxx
xxx 4 8 81ff 0 0 803 2241272 1 0 0 1436582144(修改时间) 1436582160(内容变化时间) 1436582363(状态变化时间) 4096
范例6:查看文件系统状态:
[root@node110 ~]# stat -f xxx
File: "xxx"
ID: 5093d08d2d86512 Namelen: 255 Type: ext2/ext3
Block size: 4096 Fundamental block size: 4096
Blocks: Total: 11482116 Free: 6937618 Available: 6354361
Inodes: Total: 2916352 Free: 2763908
[root@node110 ~]# stat -f Desktop/
File: "Desktop/"
ID: 5093d08d2d86512 Namelen: 255 Type: ext2/ext3
Block size: 4096 Fundamental block size: 4096
Blocks: Total: 11482116 Free: 6937618 Available: 6354361
Inodes: Total: 2916352 Free: 2763908
3.touch命令修改文件时间戳
书读得太少,以前一直简单的认为touch命令就是拿来新建一个空文件的。直到今天手欠去man了一下才发现:touch - change file timestamps,豁然开朗,触摸一下嘛(有的时间自然要发生变化)。语法如下:touch [OPTION] ... FILE( 如果指定的文件不存在会创建一个空文件) ...
-a 仅修改文件的访问时间(atime)-c 不创建文件,即使文件不存在;-d 将字符串指定的日期设定为文件的时间属性(同--date=STRING);-m 仅修改文件的mtime;-t 设置为指定的时间([[CC]YY]MMDDhhmm[.ss])DATE STRING
The --date=STRING is a mostly free format human readable date string such as "Sun, 29 Feb 2004 16:21:42 -0800" or "2004-02-29 16:21:42" or even "next Thursday". A date string may contain items indicating calendar date, time of day, time zone, day of week, relative time, relative date, and numbers. An empty string indicates the beginning of the day. The date string format is more complex than is easily documented here but is fully described in the info documentation.
4.find命令删除指定天数以前的文件
此处写出范例语句了(找到并删除/app/backup目录下符合"*dmp*"命名规则且上次修改时间为30天以前的普通文件,删除时通过-print打印到标准输出):
find /app/backup/ -name "*dmp*" -type f -mtime +31 -exec rm -rf {} \; -print
三.实现方法
上面第四点说明了怎么删除,但是就在今天突然要删除这些测试环境中间没有的文件。怎么办呢?
#!/bin/sh
for ((i=0; i<=50; i++))
do
day_time=$(date -d "$i day ago" "+%Y%m%d%H%M")
touch -m -t $day_time /app/backup/after$day_time.dmp
done
如果不愿意vi一个文件,您也可以直接从for开始执行哦(别忘啦路径是不是存在)。![]()