S3cmd移动文件和del文件夹

时间:2013-05-13 12:14:17

标签: bash s3cmd

我正在尝试编写一个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

由于

1 个答案:

答案 0 :(得分:1)

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

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

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

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

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

这是我能猜到的唯一一个你的脚本错误(第二个for-loop遭受同样的困扰),但你真的没有给我任何更好的继续。

你的第二个for循环(除了没有迭代正确的数组)没有do个关键字,所以你应该这样做:

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

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

最后,您只使用OLDBACKUPFOLDERLIST进行迭代。通过这样做可以实现同样的目的:

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

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


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

相关问题