阿里云oss空间清理(解决篇)
接上篇文章阿里云oss空间清理之奇思妙想【https://www.cnblogs.com/windysai/p/15563914.html】
话说,上篇文章说到,可能能利用考试id(也就是之前截图的一长串无规律字符串命名的目录),把2019年(含2019)前的考试id从数据库找出来。第二天,我告诉开发叫他帮我找,说领导提到这个方法。然而,换来的是开发一句:他压根不懂业务,瞎指挥!咋说呢,
考试id和老师上传图片的时间没有任何关系,一个考试的生命周期大概经历:准备考试内容 —》创建考试 —》创建答题卡 —》打印答题卡—》考试—》扫描答题卡—》上传—》阅卷—》出报表 更有一种情况是,年底创建考试,第二年才上传图片,就是上面看到的oss文件更新时间。 当我收到开发查出来的数据时,发现考试id远远大于实际存放到oss的目录个数。给过来大概6万条,oss目录实际9千不到,而且有很多空目录,里面根本没有任何图片! 我就问为啥会这样, 他说,建了考试又不一定真的去考试(这时候就会出现一个考试id),考试了不一定上传图片,上传图片不一定阅卷,阅卷不一定发布(空目录,或者上传时间理创建时间差很远)。。。这下完全绝望了,难道只能人眼去看?! 上一篇文章已经说过,我find了一部分图片到本地(850天前的部分数据),因为线上硬盘空间不够,所以没跑完就人为中断了。 首先我事先声明,这些考试id的目录,stat 去看是没用的,竟然写着“1970年”,所以要从文件更新时间入手。然后文件命名是考试id作为前缀的。 解决思路: 1、所以第一步需要把拷下来的文件挪回到原考试id目录下,处理结果如下,第一列是该考试id下的文件数,第二列是当场考试id 预处理关键命令:#1、获取数量列表,去掉行首空格 ls |awk -F'_' '{print $1}' | sort |uniq -c | sort -nr |sed 's/^[ \t]*//g' >> /tmp/test-1118
2、读取该文件,把考试文件挪回到归属地
3、配置远程ssh免秘钥,登陆到挂载有oss的服务器上,获取文件更改时间(不能获取本机时间,因为拉取下来会更改了文件时间)
4、根据关键字:2018或2019,备份到本机指定目录下
5、对比oss考试id的文件个数,及本机文件个数,相同则可以删除oss对应的考试id
1 keyword1="2018" 2 keyword2="2019" 3 4 ##进去考试文件目录(里面是一大堆以考试id为前缀的文件) 5 cd 考试文件目录 6 7 #2、从文件最多的目录开始处理 8 cat /tmp/test-1118 | while read line 9 do 10 str=`echo $line | awk '{print $2}'` 11 #获取本机考试id:$line的文件数量 12 strnum=`echo $line | awk '{print $1}'` 13 ## 创建目录,把该考试目录下的文件拷回去 14 mkdir ${str} 15 mv ${str}_* -t ${str}/ 16 17 ## 拿目录第一个文件,看更新时间(全扫描会很慢) 18 file=`ls ${str}/ | head -n1` 19 20 ssh -n -p远程机器端口 root@远程机器ip "stat 远程挂载oss的bucket/${line}/${file}" > result 21 ##获取文件更新时间 22 mt=`cat result | grep "最近更改" |awk '{print $1}'` 23 echo $line $mt >> /tmp/result_1118 24 25 ## 有关键字,则备份到本地指定目录 26 result1=$(echo $mt | grep "${keyword1}") 27 result2=$(echo $mt | grep "${keyword2}") 28 29 # 有关键字(2018年) 30 if [ "$result1" != "" ]; 31 then 32 mv 考试文件目录/$line 备份目录/2018/ 33 #统计文件数 34 remotenum=`ssh -n -p远程机器端口 root@远程机器ip "ls 远程挂载oss的bucket/${line}* |wc -l"` 35 if [ "${remotenum}" == "${strnum}" ]; then 36 echo "行数为: ${remotenum}" >> /tmp/result_1118 37 fi 38 39 # 有关键字(2019年) 40 elif [ "$result2" != "" ]; 41 then 42 mv 考试文件目录/$line 备份目录/2019/ 43 remotenum=`ssh -n -p远程机器端口 root@远程机器ip "ls 远程挂载oss的bucket/${line}* |wc -l"` 44 if [ "${remotenum}" == "${strnum}" ]; then 45 echo "行数为: ${remotenum}" >> /tmp/result_1118 46 fi 47 else 48 continue 49 fi 50 echo "" >> /tmp/result_1118 51 done
远程删除我有点怕,明天要再多测试下:
ssh -p远程机器端口 root@远程机器ip ' rm -rf 远程挂载oss的bucket/考试id* '
问题记录:
ssh -n -p远程机器端口 root@远程机器ip "stat 远程挂载oss的bucket/${line}/${file}" > result
这个ssh 要加“-n” 参数,不然远程服务器之后,只能执行一条记录(就是读取预处理文件第一行数据)
不能用变量去接收运行结果,要用文件去接收,不然格式乱了后,不好筛选文件更新时间