【问题标题】:S3cmd move file and del folderS3cmd移动文件和del文件夹
【发布时间】:2013-05-13 12:14:17
【问题描述】:

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

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

我的脚本有什么问题?

#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

谢谢

【问题讨论】:

    标签: bash s3cmd


    【解决方案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
    

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


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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-01-19
      • 1970-01-01
      • 1970-01-01
      • 2011-11-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多