gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-04 09:59:40 25 4
gpt4 key购买 nike

我有一台远程服务器,每天将 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

( echo 仅用于调试目的)

此时,此代码会查找较新和较旧的文件,但不会删除任何内容。如果我输入 find "$i"-type f -mmin +1440 -exec echo "$i"{} +,它永远不会打印任何东西,就好像 find $i没有找到任何东西,但是当我在终端中将它作为单独命令运行时,它确实找到了(减去 -exec 部分)。

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

最佳答案

除非您在文件名 find 之前添加 -name 测试,否则会将 "$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 或更高版本。

关于linux - 如何在备份期间删除旧文件但保留最近的文件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57332237/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com