【需求】
有一個(gè)目錄/data/att/,該目錄下有數(shù)百個(gè)子目錄,比如/data/att/aming,/data/att/linux.
然后再深入一層為以日期命名的目錄,例如 /data/att/aming/20220909,每天會(huì)生成一個(gè)日期新目錄。
由于/data所在磁盤快滿了,所以需要將老文件(一年以前的),挪到另外一個(gè)目錄下 /data1/att下。
示例:
mv /data/att/aming/20211001 /data1/att/aming/20211001
挪完之后,還需要做軟鏈接,
示例:
ln -s /data1/att/aming/20211001 /data/att/aming/20211001
需要寫一個(gè)腳本,要求/data/att/下所有子目錄都要按此操作,腳本會(huì)每天01:00 執(zhí)行一次,任務(wù)計(jì)劃無(wú)需考慮,只需要寫腳本即可。
提醒:要確保老文件成功挪到/data1/att下之后才能做軟鏈接,需要有日志。
【解析】
要求看起來(lái)雖然很多,但本質(zhì)上就一個(gè)核心訴求,將老的文件挪到新的目錄,然后將挪走的目錄軟鏈接到之前的位置上。
先來(lái)分析目錄結(jié)構(gòu)。
/data/att/下面有很多子目錄,每一個(gè)子目錄下面又有按日期命名的目錄。
而我們要挪走并做軟鏈接的目錄就是這個(gè)按日期命名的目錄。
首先,/data/att/下面有幾百個(gè)子目錄,所以這里需要做一個(gè)遍歷循環(huán)。
然后如何找到每一個(gè)子目錄下面一年以前的目錄呢?
先理一下思路:由于子目錄下面是按年月日命名的目錄,而且腳本需要每天都執(zhí)行,那是不是意味著,2022年9月1日要挪走并做軟鏈接的目錄是20210901呢?
原則上是這樣,但是我們要考慮到一個(gè)問(wèn)題,這個(gè)腳本第一次執(zhí)行時(shí)一年以前的目錄可不止一個(gè)啊。那換一個(gè)方法,使用find吧。
而find時(shí),只需要針對(duì)/data/att/xxx/下的這一層目錄,再往里的子目錄就不管了。
find有一個(gè) -maxdepth選項(xiàng),用來(lái)指定目錄層級(jí),就可以實(shí)現(xiàn)這個(gè)目的。
總結(jié)一下,命令是這樣的
find /data/att/xxx/ -maxdepth 1 -type d -mtime +365
注意,這個(gè)-maxdepth 1必須要放到-type d的前面去。
好,找到目錄后,接下來(lái)就該mv走了。
問(wèn)題又來(lái)了,假如在mv的時(shí)候,目標(biāo)目錄已經(jīng)存在了呢?
雖然這種情況幾乎不會(huì)發(fā)生,但也不排除有此類特例。
而且題目中也要求了,只有成功挪走了,才可以做軟鏈接,如果目標(biāo)目錄已經(jīng)存在,那mv的時(shí)候,會(huì)將目錄挪到目標(biāo)目錄下面。
說(shuō)到這,你可能已經(jīng)懵了,還是舉個(gè)具體例子吧。
比如,我想將/root/2這個(gè)目錄挪到/tmp/下去,正常命令是這樣的:
mv /root/2 /tmp/2
但是,如果/tmp/2已經(jīng)存在了,則會(huì)將/root/2 放到 /tmp/2/的里面,就變成了 /tmp/2/2
為了避免此類情況發(fā)生,我建議使用rsync來(lái)做同步,
rsync -a /root/2/ /tmp/2/
這樣,就可以保證/root/2/ 和 /tmp/2/ 是一樣的了。那你會(huì)說(shuō),使用rsync后,原來(lái)的目錄不還存在么?
是的,所以我們就需要額外做一個(gè)刪除操作,前提是,只有當(dāng)rsync 執(zhí)行成功后,才能做刪除。刪除后,再來(lái)做軟鏈接的操作,軟鏈接的命令很簡(jiǎn)單,不用多解釋了 。
最后還有一個(gè)要求,就是需要有日志輸出,比如是否挪動(dòng)成功,是否做軟鏈接成功。這就需要使用 $?這個(gè)變量來(lái)驗(yàn)證了。
這里還有一個(gè)知識(shí)點(diǎn)需要提醒各位看官。雖然我們find出來(lái)的目錄最多到日期那一層級(jí),比如:/data/att/aming/20211001,但是 /data1/att/ 那邊可不一定有 aming這個(gè)子目錄啊,所以你要么提前先創(chuàng)建好aming這一層子目錄,要么在rsync的時(shí)候,讓它自動(dòng)創(chuàng)建。
rsync有一個(gè)-R選項(xiàng),可以做到這點(diǎn),還是舉例子吧:
比如,我想將 /dir1/a/b同步到 /dir2/a/b ,但是/dir2/a目錄不存在,你可以這樣做
cd /dir1 rsync -avR a/b /dir2/
這樣就會(huì)自動(dòng)創(chuàng)建a/b兩層目錄,注意,我可是先cd到了/dir1下面,再去rsync -R
【參考答案】
腳本最終是這樣的:
#!/bin/bash main() { cd /data/att for dir in `ls` do for dir2 in `find $dir -maxdepth 1 -type d -mtime +365` do rsync -aR $dir2/ /data1/att/ if [ $? -eq 0 ] then rm -rf $dir2 echo "/data/att/$dir2 移動(dòng)成功" ln -s /data1/att/$dir2 /data/att/$dir2 && echo "/data/att/$dir2成功創(chuàng)建軟鏈接" echo else echo "/data/att/$dir 未移動(dòng)成功" fi done done } main &> /tmp/move_old_data_`date +%F`.log
審核編輯:湯梓紅
-
磁盤
+關(guān)注
關(guān)注
1文章
379瀏覽量
25209 -
Data
+關(guān)注
關(guān)注
0文章
62瀏覽量
38272
原文標(biāo)題:磁盤滿了除了刪文件還可以這樣
文章出處:【微信號(hào):aming_linux,微信公眾號(hào):阿銘linux】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論