2012-03-21 38 views
2

對於備份腳本,我需要清理舊的備份。我如何保留最近的N份備份並刪除剩餘的備份?備份腳本:如何保留最後的N個條目?

備份可以是單個文件夾,也可以是單個文件,腳本會將所有備份保留在文件夾或文件中(不混合)。

如果可能,我想avoid parsing of the output of ls.儘管備份文件夾中的所有條目都應該由備份腳本創建,並且條目名稱中不應該包含有趣的字符,但黑客可能能夠創建新的在那裏的條目。

+0

爲什麼要避免'ls'? – kev 2012-03-21 15:25:47

+0

@kev http://mywiki.wooledge.org/ParsingLs – jordanm 2012-03-21 22:12:12

回答

1

這應該這樣做(未經測試!):

  1. 確保腳本停止在任何常見的錯誤:

    #!/usr/bin/env bash 
    set -o errexit -o noclobber -o nounset -o pipefail 
    i=0 
    max=7 # Could be anything you want 
    while IFS= read -r -d '' -u 9 
    do 
        let ++i  
        if [ "$i" -gt "$max" ] 
        then 
         rm -- "$REPLY" 
        fi 
    done 9< <(find /var/backup -type f -maxdepth 1 -regex '.*/[0-9][0-9][0-9][0-9]-[0-9][0-9]-[0-9][0-9]\.tar\.gz' -print0 | sort -rz) 
    

    從外面解釋。

  2. 查找匹配YYYY-MM-DD.tar.gz格式的/ var/backup(和而不是子目錄)中的所有文件。
  3. 對這些進行反向排序,所以最新的排在第一位。
  4. 將這些文件發送到文件描述符9.這可以避免與cat,ssh或默認讀取標準輸入的其他程序有任何問題。
  5. 從FD 9中逐一讀取文件,由NUL分隔。
  6. 計數文件,直到你超過給定的最大值。
  7. 把剩下的東西從軌道上剔除。
+0

在我的GNU find中,默認的regextype是emacs,它不支持[0-9]的\ d。實際上,GNU中的任何正則表達式都找不到支持,它們都是BRE或ERE。使用ERE類型時,可以使用[0-9] {4}。 – jordanm 2012-03-21 22:16:38

+0

@jordanm:謝謝,使用最小公分母來修復。 '[x] {n}'似乎不適合我。 – l0b0 2012-03-22 08:17:40

+1

爲了使它工作,你需要像'-regextype posix-extended'這樣的東西來使用ERE。 – jordanm 2012-03-22 14:44:13