1. 程式人生 > 其它 >阿里雲oss空間清理(解決篇)

阿里雲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” 引數,不然遠端伺服器之後,只能執行一條記錄(就是讀取預處理檔案第一行資料)

  不能用變數去接收執行結果,要用檔案去接收,不然格式亂了後,不好篩選檔案更新時間