我有一个远程服务器,每天将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测试了此脚本生成具有不同时间戳的文件,但是没有成功。
答案 0 :(得分:1)
除非在文件名-name
将find
视为要搜索的目录的名称之前添加"$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或更高版本。