【问题标题】:How to delete files older than 7 days in Amazon S3?如何删除 Amazon S3 中超过 7 天的文件?
【发布时间】:2018-11-01 05:21:08
【问题描述】:

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

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

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

【问题讨论】:

    标签: file amazon-web-services amazon-s3 delete-file


    【解决方案1】:

    谢谢,约翰

    我们稍微修改了代码,它工作正常。

       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://
    • Syntax error: "done" unexpected (expecting "then")
    • @mba3gar 这是对我有用的解决方案stackoverflow.com/a/66423109/4094231
    • 这很酷,谢谢!,我只需要将 --recursive 添加到 s3 命​​令:aws s3 ls BUCKETNAME/ --recursive 以便脚本使用包含斜杠字符的路径,例如 BUCKETNAME/V1/V2/
    【解决方案2】:

    最简单的方法是在 Amazon S3 存储桶上定义 Object Lifecycle Management

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

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

    示例:GitHub - jordansissel/s3cleaner: Amazon S3 file cleaner - delete things older than a certain age, matching a pattern, etc.

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

    【讨论】:

      【解决方案3】:

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

      而且,我的 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
      

      【讨论】:

        【解决方案4】:

        这将从 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;
        

        【讨论】:

          【解决方案5】:

          感谢您的回答,我稍微修改了 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;
          

          【讨论】:

            【解决方案6】:

            我正在寻找 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
            

            【讨论】:

            • 这个命令对我不起作用,除非我使用 --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")&lt;=cepoch) { print "s3cmd del "$4 } }' | bash
            【解决方案7】:

            我创建了下面的脚本并使用 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
            

            【讨论】:

              猜你喜欢
              • 2016-09-20
              • 2012-05-07
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2021-07-09
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多