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

8
9个回答

21
最简单的方法是在Amazon S3存储桶上定义对象生命周期管理。您可以指定超过一定天数的对象应该被过期(删除)。最好的部分是,这会定期自动发生,您不需要运行自己的脚本。
如果您想要自己处理,最好的方法是编写一个脚本(例如使用Python)来获取文件列表并删除早于某个日期的文件。
示例:GitHub - jordansissel/s3cleaner: Amazon S3文件清理程序 - 删除一定年龄、匹配模式等之前的内容。 用shell脚本实现起来有点混乱。

1
这应该是被接受的答案。我们可以相应地配置Amazon S3存储桶上的OLM,而无需使用混乱的脚本。 - Daniel Vukasovich

13
我们稍微修改了代码,现在它正常工作。
   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;

在aws s3 rm s3://BUCKETNAME/$fileName的开头添加s3://。 - fanni
Syntax error: "done" unexpected (expecting "then") - Umair Ayub
@mba3gar 这是对我有用的解决方案 https://dev59.com/yavka4cB1Zd3GeqPvJLy#66423109 - Umair Ayub
这很酷,谢谢!我只需要在s3命令中添加--recursive:aws s3 ls BUCKETNAME/ --recursive,脚本就可以处理包含斜杠字符的路径,例如BUCKETNAME/V1/V2/ - 3lRicko

3
我在寻找一个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

2
除非我使用--recursive或-r,否则此命令对我无效。s3cmd ls -r 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 - Franti3ek

1

截至2023年10月,最简单的方法

我在一个多租户设置中遇到了类似的情况,其中一个用户可以创建N个存储桶,每个存储桶的保留期限不同。由于我在数据库级别上有所有与存储桶相关的配置信息,所以简单地使用s3cmd expire命令就完成了工作。

设置过期时间:

s3cmd expire s3://BUCKET_PATH --expiry-days 7 --access_key=ACCESS_KEY --secret_key=ACCESS_KEY

生命周期列表:

s3cmd getlifecycle s3://BUCKET_PATH --access_key=ACCESS_KEY --secret_key=SECRET_KEY

0

基于@Prabhu R提出的解决方案,我修补了代码并添加了变量。

因此,如果您将以下内容保存为cleanup.sh,则可以运行:

./cleanup.sh <bucket_name> <days_beyond_you_want_files_removed | number>

#!/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; 

0
我已经创建了下面的脚本,并且使用cron运行它。根据我的要求,该脚本能够每天删除一个八天前的备份文件,并且只保留最近七天的备份文件,并在此处每天生成一个文件。
#!/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

0

这将递归删除S3存储桶中159天以前的文件,其中包括带空格的文件名。上述脚本无法处理带有空格的文件名。

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

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

例如:

s3://BucketName/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;

0
我稍微修改了Prabhu R的那个,以便在Mac OS X上执行shell脚本(我在Mac OS X v10.13(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;

0
这是我为我的环境编写的一个简单脚本。
而且,我的S3存储桶中的文件以格式存在。
#!/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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接