老司機巧刪巨量文件

因為審查的原因,大量的app包需要刪除。這些包位於不同的目錄下,不能直接清空目錄,因此要刪除這些文件,還是比較麻煩的。有關部門給了一個完整的刪除列表,我檢查了一下,共有324130,這些文件小的幾個KB,大的數百兆。起初我吩咐小弟去幹,幹了一陣,反饋說文件太多,rm不起作用。我抽空去看了一下他寫的腳本,內容截取如下:

[root@sdyd163 del_soft]# more /root/del.sh 
/bin/rm -rf /mnt/nfs_dir/soft/2015/10/28/103/1033350/TDtafangshouweizhan_V8.1_mumayi_1a058.apk
/bin/rm -rf /mnt/nfs_dir/soft/2015/05/21/97/972733/zhongguotaociwang_Vv1.8.1.0303_mumayi_05f30.apk
/bin/rm -rf /mnt/nfs_dir/soft/2014/09/26/84/848499/koudaiyaoguai_shuiyin_V1.4.0_mumayi_82dcc.apk
/bin/rm -rf /mnt/nfs_dir/soft/2013/08/16/38/383759/quanhuang99duizhanban_V3.3.13_mumayi_ab8ce.apk
/bin/rm -rf /mnt/nfs_dir/soft/2013/12/17/47/473845/longyin_V4.28_mumayi_bb436.apk
/bin/rm -rf /mnt/nfs_dir/soft/2013/12/16/47/473291/zhimingfeichedang_V1.0.0_mumayi_79418.apk
/bin/rm -rf /mnt/nfs_dir/soft/2013/12/16/47/473292/jiangshilaixi_V16_mumayi_eadd5.apk
/bin/rm -rf /mnt/nfs_dir/soft/10/donghuarenwudaluandou_V1.1_mumayi_a1476.apk
/bin/rm -rf /mnt/nfs_dir/soft/12/huweijiaodoushi_V1.1_mumayi_ca2b7.apk
/bin/rm -rf /mnt/nfs_dir/soft/14/pensijiangshi_V1.0_mumayi_03868.apk
/bin/rm -rf /mnt/nfs_dir/soft/15/yongzhezhengtu_V1.06_mumayi_81f4c.apk
/bin/rm -rf /mnt/nfs_dir/soft/2013/06/26/0/20/dushisaiche5zhongwenban_V3.0.3_mumayi_dc6de.apk
/bin/rm -rf /mnt/nfs_dir/soft/2010/10/15/21/zhiwudazhanjiangshizhanlueban_V3.0_mumayi_b6c2e.apk
/bin/rm -rf /mnt/nfs_dir/soft/2010/10/23/33/datuzi_V1.0_mumayi_640a4.apk
/bin/rm -rf /mnt/nfs_dir/soft/2010/10/24/38/kuangretubage_V1.6.3_mumayi_24644.apk
/bin/rm -rf /mnt/nfs_dir/soft/2010/10/24/40/emoshashou_V1.0.2_mumayi_a1c65.apk
……………………………………….省略……………………..

這種方式不但沒有效率,而且根本進行不下去,需要改進。

基本思路是:把這些文件都移動到某個目錄,然後幹掉整個目錄。為了保證不誤刪、不發生意外,先從他這個腳本把文件名提取出來,專門生成一個文件,命令如下:

[root@sdyd163 del_soft]# awk '{print $NF}' /root/del.sh >/root/large_files_del.txt

再寫一個腳本,查看這些文件是否存在,腳本內容如下:

#先生成一個小文件列表

head -1000 /root/large_files_del.txt > /root/1000files.txt

#查看文件是否存在(有好些文件是不存在的)

[root@sdyd163 del_soft]#more /root/listfiles.sh
#!/bin/bash
for file in `cat /root/1000files.txt`
do
if [ -e $file ]
then
echo $file
fi
done

執行完畢,居然沒有文件輸出,這意味著所有文件不存在,怎麼可能呢?在文件列表中隨機抽取幾個,用ls 檢索,有些文件確實存在啊!莫非文件列表有問題?vi打開/root/1000files,文件居然是windows格式。

老司機巧刪巨量文件

用dos2unix進行格式轉換,再執行/root/listfiles.sh,可以看到輸出(僅輸出存在的文件)。為什麼dos格式查不到文件存在呢?那是因為文件列表的每一行行尾有一個\r存在

老司機巧刪巨量文件

確信欲刪除的文件存在以後,在前邊的這個腳本基礎上稍微改進一下,主要目的就是把存在的文件移動到指定的目錄。注意,因為文件巨多,而且佔用的空間很大,需要考慮目標目錄有足夠的空間來保存這些巨量文件,確定有足夠的空間以後,創建目錄/mnt/nfs_dir/del_soft/待用。修改後的腳本如下:

[root@sdyd163 del_soft]# more /root/mv_files.sh
#!/bin/bash
for file in `cat large_files_del.txt`
do
mv $file /mnt/nfs_dir/del_soft/
done

此腳本無需加判斷語句,因為mv過程會自行判斷,如果不存在,它會自動跳過。給此腳本賦予執行權限,然後開一個screen,在此screen下執行腳本/root/mv_files.sh。再開一個shell窗口,進入目錄/mnt/nfs_dir/del_soft,可查看到移動過來的文件,並且隨時間增加而增加。

老司機巧刪巨量文件

待腳本/root/mv_files.sh執行完畢,所有需要刪除的文件都移動到指定目錄/mnt/nfs_dir/del_soft,在系統上創建一個空目錄/root/sery,然後用rsync把這個/mnt/nfs_dir/del_soft目錄的文件連根拔起,子子孫孫都幹掉。具體指令如下:

[root@sdyd163 ~]# rsync --delete-before --force -r /root/sery/ /mnt/nfs_dir/del_soft

執行腳本前,總文件數是84886,佔用空間644G。

老司機巧刪巨量文件

執行這個腳本,大概耗時數十分鐘,解決了用rm不能刪除的麻煩。

想學習更多java知識的朋友可以進群:874811168 一起學習 還有全套的免費資料領取

喜歡的朋友點點關注 後臺私信回覆“Java”即可免費獲取資料一份


分享到:


相關文章: