在我做运维的职业生涯里,有超过3成的故障都是因为磁盘被写满导致,而导致磁盘被写满的原因就是日志没有做清理。
今天这个脚本需求很简单,就是找到/data/logs/目录下所有以log作为后缀的文件,删除掉60天以前的,并且对一天以前的使用gzip进行压缩(每一个都要压缩)。
其实,这个需求大家不要想复杂了,核心命令就是find,先给大家讲几个find的常见用法。
1)找到一个目录下,所有"*.txt",这里需要考虑到不仅仅该目录下,还要包括该目录的子目录下的*.txt,所以,你要直接 ls /dir/*.txt 肯定就不合适了,如何找指定名字的文件?使用这个命令:
find /dir/ -name "*.log"
2)找到/data/下10天以前的所有文件,注意只是文件,不包括目录哦
find /data/ -type f -mtime +10
3)基于目录层级来查找,比如查找当前目录下最多两层目录下的所有文件
find . -maxdepth 2 -type f
4)有时候,查找出文件来,还需要针对这些文件做一些操作,比如备份所有.conf文件
find . -type f -name "*.conf" --exec cp {} {}.bak ;
这个--exec选项类似于一个循环,循环对象就是前面的find出来的*.conf,每次循环,对象用{}代替,最后面的; 需要使用脱义,目的就是为了实现循环。
除了 --exec之外,还可以使用xargs实现,比如:
find . -type f -name "*.conf" |xargs -i cp {} {}.bak
xargs 的-i选项,是为了遍历循环,它同样使用 {}来代替循环对象,有时候,xargs可以不加-i,比如:
find . -name "*.txt" |xargs rm
这是因为rm支持批量操作,比如 rm 1.txt 2.txt 3.txt ,而 mv 不支持,只能一个一个来。
再来看脚本需求,如何找到60天以前的,使用-mtime +60,除了mtime外,还有ctime和atime。我们先来看看mtime、ctime、atime是什么意思 ?
大家看上下两次结果对比,上面是中文,下面是英文,最近访问时间 就是atime,最近更改时间就是mtime,指的是更改了文件内容,最近改动时间就是ctime,指的是更改了文件属性。
啥是文件属性呢,就是文件的大小啊、权限啊等信息。比如改了文件的读写执行权限,那么ctime会改,再比如改了文件的所有者,ctime也会变。这里有一个规律,那就是改了文件内容,mtime一定会变,从而ctime也一定会变。但反过来,你改了ctime,并不一定会改mtime。
找到60天以前的文件,指的是要找到mtime为60天以前的文件,find 就这样用
find -mtime +60
+60表示60天以前, 而-60则表示60天以内。同理,找到一天以前的,那就是find -mtime +1。
根据脚本需求,还需要找到1天以前的日志进行压缩,要注意的是,我们不能先找到1天以前的进行压缩,然后再去删除60天以前的,这个顺序不合适。因为你一旦gzip压缩了,之前的 *.log文件就没有了,你再这样"find -type f -name "*.log" -mtime +60"就找不到文件啦!
这里还有一个知识点需要给大家说一下,就是gzip压缩后,源文件没有了,生成了.gz文件,这个.gz的文件mtime跟源文件一样,大家看一下
但是ctime会变,这是因为文件大小变啦。
最终的脚本是这样的:
#!/bin/bash find /data/logs/ -name "*.log" -mtime +60 |xargs rm find /data/logs/ -name "*.log" -mtime +1 |xargs gzip
原来,竟如此简单!
全部0条评论
快来发表一下你的评论吧 !