繁体   English   中英

如何删除 Amazon S3 中超过 7 天的文件?

[英]How to delete files older than 7 days in Amazon S3?

需要删除 Amazon S3 中超过 7 天的文件,需要一个 shell 脚本来执行此操作,谷歌搜索没有成功,我找到了以下网址

http://shout.setfive.com/2011/12/05/deleting-files-older-than-specified-time-with-s3cmd-and-bash/

这对我们没有帮助,有人有脚本可以删除所有超过 7 天的文件吗?

最简单的方法是在 Amazon S3 存储桶上定义对象生命周期管理

您可以指定超过特定天数的对象应该过期(删除)。 最好的部分是这会定期自动发生,您无需运行自己的脚本。

如果你想自己做,最好的办法是编写一个脚本(例如在 Python 中)来检索文件列表并删除早于某个日期的文件。

示例: GitHub - jordansissel/s3cleaner:Amazon S3 文件清理器 - 删除超过特定年龄的内容,匹配模式等。

作为shell脚本来做有点麻烦。

谢谢,约翰

我们稍微修改了代码,它运行良好。

   aws s3 ls BUCKETNAME/ | while read -r line;
       do
        createDate=`echo $line|awk {'print $1" "$2'}`
        createDate=`date -d"$createDate" +%s`
        olderThan=`date --date "7 days ago" +%s`
        if [[ $createDate -lt $olderThan ]]
           then
            fileName=`echo $line|awk {'print $4'}`

            if [[ $fileName != "" ]]
            then
                    aws s3 rm BUCKETNAME/$fileName
            fi
       fi

       done; 

这是我为我的环境编写的一个简单脚本,希望有人会发现它有用。 谢谢。

而且,我的 s3 存储桶中的文件采用FULL_BACKUP_2020-06-25.tar.gz格式。

#!/bin/bash

#Defining variables.
#Date=`date +%Y-%m-%d`
ThreeDaysOldDate=`date -d '-3 days' +%Y-%m-%d | tr -d '-'`
Obj=`/usr/local/bin/aws s3 ls s3://bucket_name/folder/ | sed -n '2,$'p | awk '{print $4}'| cut -b 13-22 | tr -d '-'`

#Comparing files older than past 3 days and removing them from S3.
for i in $Obj
do
    if [ $i -lt $ThreeDaysOldDate ]; then
        var1="FULL_BACKUP_"
        var2=".tar.gz"
        year=$(echo $i | cut -c 1-4)
        mon=$(echo $i | cut -c 5-6)
        day=$(echo $i | cut -c 7-8)
        DATE=$var1$year-$mon-$day$var2
        /usr/local/bin/aws s3 rm s3://bucket_name/folder/$DATE > /dev/null 2>&1
    fi
done

这将从 S3 存储桶中递归删除 159 天的文件。 您可以根据需要更改日期。 其中包括带空格的文件名。 上述脚本不适用于带空格的文件名。

注意:现有的目录结构可能会被删除 如果您不喜欢目录结构,您可以使用它。

如果您更喜欢目录结构,请提供最后一个子目录的完整路径,并在每次执行时修改它以保护父目录结构

例子:

s3://桶名/dir1/dir2/dir3/

s3://BucketName/dir1/dir2/dir4/

s3://BucketName/dir1/dir2/dir5/

vim s3_file_delete.sh

s3bucket="s3://BucketName"
s3dirpath="s3://BucketName/WithOrWithoutDirectoryPath/"
aws s3 ls $s3dirpath --recursive | while read -r line;
    do
     createDate=`echo $line|awk {'print $1" "$2'}`
     createDate=`date -d"$createDate" +%s`
     olderThan=`date --date "159 days ago" +%s`
     if [[ $createDate -lt $olderThan ]]
        then
         fileName=`echo $line|awk '{a="";for (i=4;i<=NF;i++){a=a" "$i}print a}' |awk '{ sub(/^[ \t]+/, ""); print }'`

         if [[ $fileName != "" ]]
         then
                 #echo "$s3bucket/$fileName"
                 aws s3 rm "$s3bucket/$fileName"
         fi
    fi

    done;

感谢您的回答,我稍微修改了Prabhu R 的那个,以便能够在MacOsX上执行 shell 脚本(我用 High Sierra 测试过)

BUCKETNAME=s3://BucketName/WithOrWithoutDirectoryPath/
aws s3 ls $BUCKETNAME | while read -r line;
do
  createDate=`echo $line|awk {'print $1" "$2'}`
  createDate=`gdate -d"$createDate" +%s` 
  olderThan=`gdate '+%s' -d '1 week ago'`
  if [[ $createDate -lt $olderThan ]]
    then
      fileName=`echo $line|awk {'print $4'}`
      if [[ $fileName != "" ]]
        then
          echo "deleting " $BUCKETNAME$fileName
          aws s3 rm $BUCKETNAME$fileName
      fi
  fi
done;

我正在寻找 s3cmd 命令来删除超过 N 天的文件,这对我有用

s3cmd ls s3://your-address-here/ | awk -v dys="2" 'BEGIN { depoch=(dys*86400);cepoch=(systime()-depoch) } { gsub("-"," ",$1);gsub(":"," ",$2 );if (mktime($1" "$2" 00")<=cepoch) { print "s3cmd del "$4 } }' | bash

我创建了以下脚本并使用 cron 运行。 根据我的要求,脚本可以每天删除一个早于 8 天的备份文件,并且只能保留 7 天的备份文件并每天在此处生成一个文件。

#!/bin/bash
#Purpose: functional for 7 days backup retention policy
count=$(/usr/bin/sudo /usr/local/bin/aws s3 ls bucketname  |nl|tail -n1|awk '{print $1}')
if [[ "$count" == 8 ]]
then
    filename=$(/usr/bin/sudo /usr/local/bin/aws s3 ls bucketname|awk '{print $NF}'|head -n1)
    /usr/bin/sudo /usr/local/bin/aws s3 rm s3://bucketname/$filename
fi

根据@Prabhu R 建议的解决方案,我修补了代码并添加了变量。

所以如果你把波纹管保存到 cleanup.sh,你可以运行:

./cleanup.sh <bucket_name> <days_beyond_you_want_files_removed | 号码>

#!/bin/bash
 
aws s3 ls $1/ --recursive | while read -r line;
     do
      createDate=`echo $line|awk {'print $1" "$2'}`
      createDate=`date -d"$createDate" +%s`
      olderThan=`date --date "$2 days ago" +%s`
      if [[ $createDate -lt $olderThan ]]
         then
          fileName=`echo $line|awk {'print $4'}`

          if [[ $fileName != "" ]]
          then
                  aws s3 rm s3://$1/$fileName
          fi
     fi

     done; 

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM