2

我正在尝试编写一个 bash 脚本来自动化我的备份计划。我使用一个脚本每天创建一个 S3 文件夹,并将日期作为文件夹名称。并且每小时他都会在此文件夹中上传一个备份。示例:/Application1/20130513/dump.01

我的备份计划是保留 2 天的完整备份(每小时),并在 s3 文件夹(“oldbackup”)中保留最近 15 天的 1 个备份。

我的脚本有什么问题?

#check and clean the S3 bucket
BUCKETNAME='application1';
FOLDERLIST = s3cmd ls s3://$BUCKETNAME
LIMITFOLDER = date --date='1 days ago' +'%Y%m%d'

for f in $FOLDERLIST
do
    if [[ ${f} > $LIMITFOLDER && f != "oldbackup" ]]; then
        s3cmd sync s3://$BUCKETNAME/$f/dump.rdb.0 s3://$BUCKETNAME/"oldbackup"/dump.rdb.$f
        s3cmd del s3://$BUCKETNAME/$f --recursive;
    fi
done

OLDBACKUP = s3cmd ls s3://$BUCKETNAME/"oldbackup"
LIMITOLDBACKUP = date --date='14 days ago' +'%Y%m%d'
for dump in $OLDBACKUP
    if [${dump} > $LIMITOLDBACKUP]; then
                s3cmd del s3://$BUCKETNAME/"oldbackup"/$dump
    fi
done

谢谢

4

1 回答 1

1

首先,您可能想要存储FOLDERLIST为数组。你可以这样做: FOLDERLIST=($(command)).

接下来,您应该始终将您打算使用的命令的输出存储为像这样的字符串OUTPUT="$(command)"

因此,例如,您的前三行应如下所示:

BUCKETNAME="application1"
FOLDERLIST=($(s3cmd ls s3://$BUCKETNAME))
LIMITFOLDER="$(date --date="1 days ago" +"%Y%m%d")"

现在你的第一个 for 循环应该可以工作了。

这是我唯一能猜到你的脚本有问题的地方(第二个 for 循环也有同样的问题),但你真的没有给我更好的继续。

您的第二个 for 循环(除了不遍历正确的数组)没有do关键字,因此您应该这样做:

for dump in $OLDBACKUP
do
   # rest of loop body
done

这可能是您的脚本的另一个问题。

最后,您只使用OLDBACKUPFOLDERLIST迭代。只需执行以下操作即可完成相同的操作:

for f in $(s3cmd ls s3://$BUCKETNAME)
do
  # loop body
done

除非您计划多次重用它,否则无需将输出存储在变量中。


不过,作为一个单独的问题,没有必要使用完全由大写字母组成的变量名。只要您了解使用命令名称会导致错误,您也可以使用小写的变量名称。

于 2013-05-13T13:48:36.570 回答