背景:我有一个备份目录/home/kzy/bakup,会每天备份一些信息。随着日子一天天的过去,这个文件夹越来越大,终于把磁盘撑满了.....
需求:当磁盘占有率超过80%时自动删除该文件夹下最老的30天文件,但要至少保留最近7天的文件。
代码:
如下。(码了一整天啊,才把这么点代码给码出来啊!!!shell编程超级烂啊!!!连基本语法都要查啊!!!各种报错各种调啊!!!为什么我的水平这么烂!!!!!!)
#!/bin/bash#monitor available disk spacedir='/home/kzy/bakup'rm_date=30least_retain_date=7threshold=80SPACE=$(df -P| sed -n '/\/$/p' | gawk '{print $5}' | sed 's/%//')cur_date=$(date "+%Y-%m-%d %H:%M:%S")echo "==========$cur_date start=========="if [ $SPACE -ge $threshold ]then oldest_file=$(ls -alt| tail -1| gawk '{print $9}') oldest_date=$(stat $oldest_file| grep ^Modify| gawk '{print$2}'| sed 's/-//g') cur_time=$(date +%s) oldest_time=$(date -d ${oldest_date} +%s) diff_time=$(($cur_time - $oldest_time)) diff_date=$(($diff_time / 86400)) remain_date=$least_retain_date if [ $(($diff_date-$rm_date)) -ge $least_retain_date ] then remain_date=$(expr $diff_date - $rm_date) fi cmd="find $dir -mtime +$remain_date -exec rm -rvf {} \;" echo "Space is use more than $threshold%! Rmove some tmp files!" echo $cmd echo "---detail---" eval $cmdelse echo "$SPACE% used!"fiecho "=======end======="
放在crontab里每天跑就行了,记得保留日志。
------------------------------------细节分割线-----------------------------------
下面,记录一下我学到的各种知识。
1.在我写了一个简单的if 语句后,不停报错Syntax error: “fi” unexpected (expecting “then”
原因:我是在windows下编写的代码,然后拖到linux下面跑的。由于两个平台的格式不同,windows下编辑的代码会有特殊字符,所以运行失败。
解决:在linux下安装dos2unix,运行
dos2unix monitor_disk.sh
后面的是要转换的文件名。
2. 查看磁盘使用情况 df命令
df -hP
结果
Filesystem Size Used Avail Use% Mounted onudev 973M 0 973M 0% /devtmpfs 199M 26M 174M 13% /run/dev/sda1 19G 14G 4.3G 76% /tmpfs 992M 308K 992M 1% /dev/shmtmpfs 5.0M 4.0K 5.0M 1% /run/locktmpfs 992M 0 992M 0% /sys/fs/cgroupcgmfs 100K 0 100K 0% /run/cgmanager/fsnone 992M 2.6M 990M 1% /tmp/guest-gRYtRhtmpfs 199M 68K 199M 1% /run/user/123tmpfs 199M 76K 199M 1% /run/user/1000/dev/sr0 71M 71M 0 100% /media/zhuwenqian/VMware Tools
参数说明:
-h : 已M、G等单位显示,更便于阅读
-P : 如果没有-P,则在文件路径过长时结果显示会分行,导致难以用脚本处理。加上-P可以保证不换行。
相关命令:查看文件夹占用磁盘空间大小 du -h
3. ls结果按时间排序
ls -alt
如上,加个-t参数就行了
4.变量算数运算
1.用expr
a=9b=3c=$(expr $a - $b) #correct c=6 c=$(expr $a-$b) #error c=9-3
注意一定要有空格
2.用()
a=9b=3d=$(($a - $b)) #correct d=6d=$(($a-$b)) #correct d=6
比较推荐第二种,写法,不用担心空格。
注,最外面的$()表示执行命令,里面的($a-$b)是运算式
5.字符串转命令eval
cmd="echo $a"eval $cmd
6.sed命令
参考:
7.查询文件修改时间 stat
参考:
stat test.txt