0

我的任务是从我们的 Linux 数据库中删除旧的备份文件(除了最新的 3 个)。由于我们有多种备份,我必须为每种备份类型保留至少 3 个备份文件。

我的脚本应该将具有相似(匹配)名称的所有文件组合在一起,并删除除最后 3 个文件之外的所有文件(我假设操作系统将为我对这些文件进行排序,因此最新的备份也将是最后的备份)

这些文件的格式可以是任意数字,project_name.000000-000000.svndmp.bz2也可以是任意名称。前 6 位数字是名称的一部分,而后 6 位数字描述备份的版本。0project_name

到目前为止,我的代码如下所示:

for i in *.svndmp.bz2 # only check backup files
do
    nOfOccurences = # Need to find out, how many files have the same name
    currentFile = 0
    for f in awk -F"[.-]" '{print $1,$2}' $i # This doesn't work
    do
        if [nOfOccurences - $currentFile -gt 3]
        then
            break
        else
            rm $f
            currentFile++
        fi
    done
done

我知道,我的脚本可能会尝试删除旧版本的备份 4 次,然后再进行下一次备份。我不是在寻找性能或效率(我们没有那么多备份)。

我的代码是在网上搜索了 4 个小时的结果,而我的谷歌查询已经用完了(我的老板开始想知道为什么我仍然没有回到我的日常任务中)

任何人都可以给我意见,我可以如何解决我的问题?

  • 寻找nOfOccurences
  • 让 awk 找到适合模式的文件"$1.$2-*"
4

1 回答 1

2

试试这个,看看它是否符合您的要求。

for project in `ls -1 | awk -F'-' '{ print $1}' | uniq`; do
    files=`ls -1 ${project}* | sort`
    n_occur=`echo "$files" | wc -l`
    for f in $files; do
        if ((n_occur < 3)); then
           break
        fi
        echo "rm" $f;
        ((--n_occur))
    done
done

如果输出似乎没问题,只需更换 echo 行。啊,如果有什么属于自己的,请不要打我。使用风险自负。

于 2013-02-11T18:21:49.827 回答