當我們在備份文件的時候,通常只保留一定的數量,例如說 10 天份,我們可能會這樣寫:
$ find PATH_TO_FILES -mtime +30 | xargs rm -f &> /dev/null
$ find PATH_TO_FILES -mtime +30 -exec rm {} \ &> /dev/null;
這兩種寫法結果一樣,都是會刪除建立超過三十天以上的檔案,不過這會有個問題,假設今天因為某些因素備份指令中斷了,但 crontab 依舊在跑刪除指令,若 op 沒有及時發現,備份檔終究會被刪光,因此另一種寫法我認為是比較好的
我們先製造六個檔案
i=1; while [ $i -lt 7 ]; do touch $i; ((i++)); done
$ ll -d ./*
-rw-r--r-- 1 root root 0 12月 22 11:45 ./1
-rw-r--r-- 1 root root 0 12月 22 11:45 ./2
-rw-r--r-- 1 root root 0 12月 22 11:45 ./3
-rw-r--r-- 1 root root 0 12月 22 11:45 ./4
-rw-r--r-- 1 root root 0 12月 22 11:45 ./5
-rw-r--r-- 1 root root 0 12月 22 11:45 ./6
假設我們只要保留 5 個檔案,指令就是:
$ ls -ltd ./* | tail -n +6 | awk '{print $NF}' | xargs rm -f &> /dev/null
-d
過濾了 ./
以及 ../
,-t
會照時間排序,tail -n +6
就是拉出超過 n
數量的結果,要保留 5 份的話要填入 6,所以檔名 1-6 時 6 會被篩選出來,awk '{print $NF}'
會印出篩選出來資訊的尾端,也就是檔名,最後就用 xargs rm -f
刪除該檔案,這樣寫的話不管時間的影響該備份目錄永遠會留下你指定的檔案數量。