备份脚本:如何保留最后N个条目?

时间:2012-03-21 14:18:46

标签: bash backup

对于备份脚本,我需要清理旧备份。如何保留最后N个备份并删除其余备份?

备份是单个文件夹或单个文件,脚本会将所有备份保留在文件夹或文件中(不混合)。

如果可能的话,我想avoid parsing of the output of ls.即使备份文件夹中的所有条目都应该由备份脚本创建,并且条目名称中不应该有任何有趣的字符,黑客也许能够在那里创建新条目。

1 个答案:

答案 0 :(得分: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)

从外面解释:

  1. 确保脚本在任何常见错误时停止。
  2. 查找匹配YYYY-MM-DD.tar.gz格式的/ var / backup(和 not 子目录)中的所有文件。
  3. 对这些进行反向排序,因此最新列出。
  4. 将这些发送到文件描述符9.这可以避免catssh或其他默认读取标准输入的程序出现任何问题。
  5. 从FD 9逐个读取文件,由NUL分隔。
  6. 计算文件,直到超过给定的最大值
  7. 从轨道上取下其余部分。