阿里雲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” 參數,不然遠程服務器之后,只能執行一條記錄(就是讀取預處理文件第一行數據)
不能用變量去接收運行結果,要用文件去接收,不然格式亂了后,不好篩選文件更新時間