背景:
服务器存放头像位置 /home/server/upload/avatar/
一种存放方式为...在这个路径下建一个以用户uid命名的文件夹..下面在存入用户头像
二种存放方式为...在这个路径下有一个叫(null) 的文件夹.里面存了用户头像图片.....图片都是时间戳命名.找不出是哪个用户的..这是研发写的bug
mysql数据库中用户表有个字段叫avatar存放了其头像图片的完整连接如 http://13.125.14.158:9999/upload/avatar/819/15656323565.png
http://13.125.14.158:9999/upload/avatar/(null)/15656323565.png
还有一种用户头像为系统默认头像 即阿拉伯数字 1.2 .3等
起因:
头像服务器硬盘占用马上爆满..
分析:
用户注销后,研发没有即时删除其头像图片
用户换头像后..也没有即时删除其旧头像图片,导致硬盘占用快速增涨
准备数据:
导出新版更新后上线过的用户头像连接
select avatar from user where uid in (select uid from im_user_detail) 此sql不作多余解说
将导出的数据保存为user.txt传到linux中
cat user.txt |grep upload|grep null >usernull.txt 选出使用(null)文件夹头像的数据
awk -F ")/" '{print $2}' usernull.txt > usernull1.txt 直接选择出图片文件名
cat user.txt |grep -v null |grep upload >userfile.txt 选 出使用uid文件夹存放图片的数据
awk -F "avatar" '{print $2}' userfile.txt > userfile1.txt 去掉前缀 余下
awk -F "/" '{print $1}' userfile1.txt >userfile2.txt 去掉后缀..只留uid文件夹名
进入(null)文件夹 ls > null.txt 取得服务器现存的图片
进入avatar文件 ls > file.txt 取得服务器现存的uid文件夹 在file.txt中删掉(null)这个名字
将usernull1.txt userfile1.txt null.txt file.txt 导出 并在文件第一行加入id两个字符便于插入数据库
将四个文件全部导入mysql..对应四张表 usernull1 userfile null file
select * from null where id not in (select id from usernull1) 选 择出null文件夹中现有用户没有使用的头像图片
select * from file where id not in (select id from userfile) 选 择出avatar下现有用户没有使用的uid文件夹
依次存为delnull.txt delfile.txt
编写脚本:
数据有了..本来以为一个很简单 的for in就可以将多余的图片.文件夹删除..后面发现错了..由于编码还是什么的问题..我也不知道哪有问题.一直删不掉..经过多次测试.发现图片名和文件夹名后面多了一个^M
file=`cat delnull.txt`
echo file in group ok
for pic in ${file[*]}
do
cd /home/server/upload/avatar/\(null\)&& pwd && rm -fr $pic
echo "delete $pic ok"
done
开始用了这个不行...后面改为del.sh
#!/bin/bash
file=`cat delfile.txt`
for a in ${file[*]}
do
echo "rm -fr /home/server/upload/avatar/$a"
done
./del.sh >11.sh
cat 11.sh
:%s/^M//g 替换掉后面的怪符号 注意^M打法是 按住ctrl 不放再按v 和m
最后执行11.sh将文件夹删除...null中图片删除同理..