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

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

      
  • 相关阅读:
    Leetcode 238. Product of Array Except Self
    Leetcode 103. Binary Tree Zigzag Level Order Traversal
    Leetcode 290. Word Pattern
    Leetcode 205. Isomorphic Strings
    Leetcode 107. Binary Tree Level Order Traversal II
    Leetcode 102. Binary Tree Level Order Traversal
    三目运算符
    简单判断案例— 分支结构的应用
    用switch判断月份的练习
    java基本打印练习《我行我素购物系统》
  • 原文地址:https://www.cnblogs.com/windysai/p/15573975.html
Copyright © 2011-2022 走看看