阿里云oss空间清理(解决篇)

阿里云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” 参数,不然远程服务器之后,只能执行一条记录(就是读取预处理文件第一行数据)

  不能用变量去接收运行结果,要用文件去接收,不然格式乱了后,不好筛选文件更新时间

  
posted @ 2021-11-18 19:28  windysai  阅读(1203)  评论(0编辑  收藏  举报