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

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

      
  • 相关阅读:
    3DMAX贴图无法显示
    3DMAX2016安装教程【图文】
    OSG学习:转动的小汽车示例
    JAVA Eclipse 快捷键
    解决JQUERY在IE8,7,6下将字符串转成XML对象时产生的BUG
    毕设二:python 爬取京东的商品评论
    redis 注册为服务
    python 爬取bilibili 视频弹幕
    python 爬取36kr 7x24h快讯
    jQuery实现表格冻结行和列
  • 原文地址:https://www.cnblogs.com/windysai/p/15573975.html
Copyright © 2011-2022 走看看