如何使用aws s3api调用Amazon S3 API删除S3存储桶中的文件夹
用aws s3api实现递归删除S3指定前缀下所有对象的方法
你已经知道的aws s3 rm s3://xyz/abc --recursive是AWS CLI封装的高层便捷命令,要使用底层s3api实现同等效果,有两种常用方案:
方案1:批量删除(推荐,适合大量对象场景)
配合s3api list-objects-v2查询目标前缀的所有对象,再调用delete-objects接口批量删除,一次最多可删1000个对象,效率远高于逐行删除。
带jq工具的命令示例(jq为常用JSON处理工具,多数环境默认预装)
aws s3api delete-objects \ --bucket xyz \ --delete "$(aws s3api list-objects-v2 \ --bucket xyz \ --prefix abc/ \ --query 'Objects[].{Key:Key}' \ --output json | jq '{Objects: ., Quiet: false}')"
无jq工具的命令示例
aws s3api delete-objects \ --bucket xyz \ --delete Objects="$(aws s3api list-objects-v2 --bucket xyz --prefix abc/ --query 'Objects[].{Key=Key}' --output text | awk '{printf "{Key=\"%s\"},", $0}' | sed 's/,$//')",Quiet=false
方案2:逐行删除(适合少量对象场景)
逻辑更简单,遍历查询到的对象逐个调用delete-object接口删除:
aws s3api list-objects-v2 \ --bucket xyz \ --prefix abc/ \ --query 'Objects[].Key' \ --output text | tr '\t' '\n' | xargs -I {} aws s3api delete-object --bucket xyz --key {}
注意事项
- 目标前缀末尾建议加
/,避免误删前缀名称相似的其他对象,比如你要删abc文件夹下的内容,就写--prefix abc/- 如果目标前缀下对象超过1000个,
list-objects-v2默认仅返回前1000条,需要添加分页参数或循环调用覆盖全量对象- 上述两种方案都会同步删除S3中用于标记空文件夹的
abc/0字节占位对象,最终效果和aws s3 rm --recursive完全一致
内容的提问来源于stack exchange,提问作者Debdut Goswami
相关产品推荐
相关产品推荐

