阿里雲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” 參數,不然遠程服務器之后,只能執行一條記錄(就是讀取預處理文件第一行數據)

  不能用變量去接收運行結果,要用文件去接收,不然格式亂了后,不好篩選文件更新時間

  


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM