如何编写Shell脚本删除Amazon S3中7天以上的旧文件?
解决Amazon S3删除7天以上旧文件的Shell脚本方案
别担心,我来给你几个经过验证、可以直接使用的Shell脚本方案,帮你批量清理S3中超过7天的旧文件。
方法一:使用AWS CLI(推荐,官方工具更稳定)
AWS CLI是亚马逊官方提供的命令行工具,功能全面且维护及时,优先推荐使用。
前提条件
- 已安装AWS CLI:如果没装,可以通过包管理器(如
apt install awscli或brew install awscli)安装 - 已配置AWS凭证:运行
aws configure输入你的Access Key、Secret Key、默认区域等信息
脚本示例
#!/bin/bash # 配置参数:替换成你的S3桶名和需要保留的天数 BUCKET_NAME="your-target-bucket" RETAIN_DAYS=7 # 计算UTC格式的截止日期(S3文件的LastModified字段使用UTC时间,避免时区误差) CUTOFF_DATE=$(date -d "-$RETAIN_DAYS days" +%Y-%m-%dT%H:%M:%SZ) # 列出所有超过截止日期的文件并批量删除 # 注:如果文件数量极大,可以添加--page-size 1000参数提升列表效率 aws s3api list-objects-v2 --bucket "$BUCKET_NAME" \ --query "Contents[?LastModified < '$CUTOFF_DATE'].Key" \ --output text | tr '\t' '\n' | while read -r FILE_KEY; do if [ -n "$FILE_KEY" ]; then echo "正在删除文件:s3://$BUCKET_NAME/$FILE_KEY" aws s3 rm "s3://$BUCKET_NAME/$FILE_KEY" fi done
优化建议(针对大量文件)
如果你的S3桶中有上万级别的文件,用xargs替代while循环可以大幅提升删除效率:
#!/bin/bash BUCKET_NAME="your-target-bucket" RETAIN_DAYS=7 CUTOFF_DATE=$(date -d "-$RETAIN_DAYS days" +%Y-%m-%dT%H:%M:%SZ) aws s3api list-objects-v2 --bucket "$BUCKET_NAME" \ --query "Contents[?LastModified < '$CUTOFF_DATE'].Key" \ --output text | tr '\t' '\n' | xargs -I {} aws s3 rm "s3://$BUCKET_NAME/{}"
方法二:使用s3cmd(如果你已经在使用这个工具)
如果你习惯用s3cmd管理S3,也可以用以下脚本实现需求:
前提条件
- 已安装并配置s3cmd:运行
s3cmd --configure完成凭证配置
脚本示例
#!/bin/bash BUCKET_NAME="your-target-bucket" RETAIN_DAYS=7 # 计算截止日期(注意时区,建议和S3的UTC时间对齐) CUTOFF_DATE=$(date -u -d "-$RETAIN_DAYS days" +%Y-%m-%d) # 列出旧文件并删除 s3cmd ls "s3://$BUCKET_NAME/" | awk -v cutoff="$CUTOFF_DATE" '$1 < cutoff {print $4}' | while read -r FILE_PATH; do echo "正在删除文件:$FILE_PATH" s3cmd del "$FILE_PATH" done
重要注意事项
- 先测试再执行:把脚本中的删除命令(
aws s3 rm或s3cmd del)换成echo,先确认输出的文件列表是你想要删除的,避免误删重要文件 - 权限验证:确保你的AWS凭证或s3cmd配置拥有
s3:ListBucket(列出桶内文件)和s3:DeleteObject(删除文件)的权限 - 前缀过滤:如果只需要清理桶内某个路径下的文件,可以在
list-objects-v2中添加--prefix "your/folder/path/"参数,或者在s3cmd ls中指定具体路径 - 时区问题:S3存储的文件修改时间是UTC,所以计算截止日期时尽量使用UTC时间(如方法一中的
date -d默认可能是本地时间,建议加上-u参数强制使用UTC)
内容的提问来源于stack exchange,提问作者Prabhu R
相关产品推荐
相关产品推荐

