find是最常见和最强大的查找命令,你可以用它找到任何你想找的文件。
例如,在一个目录中保留最近7天的文件,7天前的文件自动删除。
find . -mtime +7 -type f -name *.mail_[12] -exec rm -rf {} \;
说明:
. –设置查找的目录;
-mtime +7 –设置时间为7天前;-mtime -7 表示7天之内;-mtime 7 表示7天前的那一天;-mtime 0 表示1天之内;
-type f –设置查找的类型为文件,这个参数一定要有,目录和其他字节啥的不要管;
-name *.mail[12] –设置文件名称中包含mail_1或者mail_2;
-exec把find到的文件名作为参数传递给后面的命令行,代替{}的部分,-exec rm -f –查找完毕后执行删除操作。-exec后便跟的命令行,必须用“ \;”结束。
你可能会在其他地方看到与 -exec rm {} \; 不同的删除方式 xargs rm -rf,两者都可以把find命令查找到的结果删除,其区别简单的说是前者是把find发现的结果一次性传给exec选项,这样当文件数量较多的时候,就可能会出现“参数太多”之类的错误,相比较而言,后者就可以避免这个错误,因为xargs命令会分批次的处理结果。
将此命令写入crontab后即可自动完成查找并删除的工作了。
另外,说明一下 find -mtime +N/-N/N 的时间算法:
以当前时间点开始算起,
+表示往左,从该时间点开始再继续往更早推,可以称作xx以外;
-表示往右,从该时间点算起往后的时间推,可以称作xx以内;
没有加减号表示据此此前第N天。
一天是指当前系统时间算起的,向前减24小时。
对于 find . -mtime N 实际上你应该这样理解:N * 24
+1 表示 1 * 24 +24小时以外;
+0 表示 0 * 24 +24小时以外;
1 表示 1 * 24 + 24 到 24 之间;
0 表示 0 *24 + 24 到 0 之间;
-1 表示 0*24 +24 内,甚至为未来时间…
可以用数学公式来体现:
+n -- n天以前的文件
((n+1)*24h, -∞)
n -- 前n天的文件
(0, n*24h)
-n -- 天以内的文件
[n*24h,(n+1)*24h]
图释:
find -mtime +N/-N/N 的时间算法图释
更多用法:
find . -amin -10 # 查找在系统中最后10分钟访问的文件
find . -atime -2 # 查找在系统中最后48小时访问的文件
find . -empty # 查找在系统中为空的文件或者文件夹
find . -group cat # 查找在系统中属于 groupcat的文件
find . -mmin -5 # 查找在系统中最后5分钟里修改过的文件
find . -mtime -1 #查找在系统中最后24小时里修改过的文件,结果和 find . -mtime 0 一样
find . -nouser #查找在系统中属于作废用户的文件
find . -user fred #查找在系统中属于FRED这个用户的文件
最后,给个示例。
1、编写清理日志脚本clear.sh
#!/bin/sh
find . -mtime +6 -name “.log” -exec rm {} \;
find /opt/bak -mtime +6 -name “.dmp” -exec rm {} \;
2、给脚本授权
chmod +x clear.sh
3、加入定时执行任务
vi /etc/crontab
在最后加入:
00 2 * * * root /opt/sh/clear.sh
4、重启crontab服务
service crond restart
注:
实际执行前,请先自行测试是否有误!例如:
find . -type f -mtime +5 | xargs ls -l --time-style='+%Y-%m-%d'
或者
find . -type f -mtime +5 -exec ls -l --time-style='+%Y-%m-%d' {} \;
切记 –time-style要和 -l 选项一起使用。格式可以修改,比如’+%Y-%m-%d’ 只显示日期。更简单的方法是:ls -l –full-time