如何删除较旧的文件,但在备份期间保留最近的文件?

时间:2019-08-02 19:11:11

标签: linux bash backup

我有一个远程服务器,每天将30多个备份文件复制到本地服务器,并且仅当成功复制了较新的备份时,我才想删除旧备份。

我尝试使用不同的代码,设法删除了较旧的文件,但遇到的问题是,如果找到一个新的备份,它将删除所有较旧的文件。

我有类似的东西(与20个虚拟机一起显示):

vm001-2019-08-01.bck
vm001-2019-07-28.bck
vm002-2019-08-01.bck
vm003-2019-07-29.bck
vm004-2019-08-01.bck
vm004-2019-07-31.bck
vm004-2019-07-30.bck
vm004-2019-07-29.bck
...

我想删除所有内容,但仅保留最新的内容。 即:擦除:

vm001-2019-07-28.bck
vm002-2019-07-29.bck
vm004-2019-07-31.bck
vm004-2019-07-30.bck
vm004-2019-07-29.bck

并仅保留:

vm001-2019-08-01.bck
vm002-2019-08-01.bck
vm003-2019-07-29.bck
vm004-2019-08-01.bck

我遇到的问题是,如果我对任何计算机进行了最新备份,则vm-003-2019-07-29之类的文件将被删除,因为它们即使是不同的计算机也较旧。

我知道网站上存在该问题的多种变体,但我无法完全解决。

我一直在尝试这段代码的变体:

#!/bin/bash

for i in ./*.bck
do
  echo "found" "$i"
  if [[ -n $(find "$i" -type f -mmin -1440) ]]
  then
    echo "$i"
    find "$i" -type f -mmin +1440 -exec rm -f "$i" {} +
  fi
done

(回声仅用于调试目的)

这时,此代码查找较新和较旧的文件,但不删除任何内容。如果我放置find "$i" -type f -mmin +1440 -exec echo "$i" {} +,它将永远不会打印任何内容,就像find $i找不到任何东西一样,但是当我在终端中以独奏命令运行它时,它会((减去-exec部分)。

我已经使用touch -d测试了此脚本生成具有不同时间戳的文件,但是没有成功。

1 个答案:

答案 0 :(得分:1)

除非在文件名-namefind视为要搜索的目录的名称之前添加"$i"测试,所以您的find命令应是:

find -name "$i" -type f -mmin -1440

将在当前目录中搜索。或者

find /path/to/dir -name "$i" -type f -mmin -1440

它将在名为“ / path / to / dir”的目录中搜索。

但是,基于BashFAQ/099,我将执行此操作以删除每个VM(未测试)的除最新文件以外的所有文件:

#!/bin/bash
declare -A newest  # associative array to store name of newest file for each VM
for f in *
do
    vm=${f%%-*}    # extracts vm name from filename (i.e. vmm001 from vm001-2019-08-01.bck)
    if [[ -f $f && $f -nt ${newest["$vm"]} ]]
    then
        newest["$vm"]=$f
    fi
done

for f in *
do
    vm=${f%%-*}
    if [[ -f $f && $f != ${newest["$vm"]} ]]
    then
        rm "$f"
    fi
done

设置为针对当前目录中的文件运行。假定文件的名称如问题中所示(VM名称与其他文件名之间用连字符分隔)。为了使用关联数组,需要Bash 4或更高版本。