通过shell脚本自动清理超过指定大小的文件
发布时间:2020-12-15 23:23:26 所属栏目:安全 来源:网络整理
导读:? 由于线上业务用的squid,根据经验值如果长时间运行则缓存目录下的swap.state会慢慢变大,一旦超过60M,squid的性能就会急剧下降,因此需要定时去清理大于60M的swap.state文件。由此引出需求,查找cache目录下的所有大于60M的swap.state文件并清除,即: 1
? 由于线上业务用的squid,根据经验值如果长时间运行则缓存目录下的swap.state会慢慢变大,一旦超过60M,squid的性能就会急剧下降,因此需要定时去清理大于60M的swap.state文件。由此引出需求,查找cache目录下的所有大于60M的swap.state文件并清除,即: 缓存目录为/data/cache,针对以上需求,做法如下: [[email?protected] ~]# du -sh /data/cache/coss/squid*/swap.state 2.7M /data/cache/coss/squid1/swap.state 270k /data/cache/coss/squid2/swap.state 2.7M /data/cache/coss/squid3/swap.state 2.7M /data/cache/coss/squid4/swap.state 53M /data/cache/coss/squid5/swap.state 35M /data/cache/coss/squid6/swap.state 5.6M /data/cache/coss/squid7/swap.state 4.6M /data/cache/coss/squid8/swap.state 97M /data/cache/coss/squid9/swap.state 75M /data/cache/coss/squid10/swap.state 74M /data/cache/coss/squid11/swap.state 解题思路: 使用du -sh 查找大于swap.state的大小,同时使用awk 过滤第一个字段,接着为了过滤掉M、只保留数字,再次使用awk 制定"M" 作为分界符过滤出文件大小。 [[email?protected] ~]# du -sh /data/cache/coss/squid*/swap.state | awk ‘{ print $1 }‘ | awk -F"M" ‘{ print $1 }‘ 2.7 270k 2.7 2.7 53 35 5.6 4.6 97 75 74 以上做法可以看出du -sh这种方案的缺点: du -sh 的输入会自动转换单位,比如K、M、G,只过滤M会导致部分文件大小无法正常获取,例如第二个的270k。同时使用了多个管道 较为繁琐,且管道过滤之后的只有文件大小,相对应的文件名丢失,后续的处理较麻烦,当然也可以使用数组等解决,因此放弃此方案。 更好的方法: 不要使用带单位的输出,直接使用ls -l 的输出就可以作为相应的数据源。ls -l输出的结果以字节为单位,简单,容易处理。 不过需要同时考虑到第一个方案的缺点,因此加了两个临时变量去存储相应的文件名、文件大小。 最终的方案: [[email?protected] ~]# vim /root/cache_gt_60.sh #!/bin/bash for i in $(ls -l /data/cache/coss/squid*/swap.state) do size=`echo $i | awk ‘{ print $5 }‘` file=`echo $i | awk ‘{ print $9 }‘` if [ $size -gt 61865984 ] ; then echo $file; echo $size echo >$file fi done 温馨提示: 61865984 字节换成成M单位为60M,这里判断是否大于60M,大于则使用echo 语句将对应文件置空。 总结:采用du -sh这种带自动单位换成的命令去处理,麻烦多多,有时候还是简单的使用"ls -l"比较好。 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |