如何使用AWS CLI删除含特殊字符'+'的S3空文件夹?
如何删除AWS S3中含特殊字符
+的空文件夹 我尝试用AWS CLI删除一个空文件夹结构,但所有操作均未生效。该根文件夹为/+7000/,问题明确出在特殊字符+上。我的rm命令在不含特殊字符的其他文件夹上可正常工作,且CLI未返回错误信息。该如何编写脚本识别并删除此文件夹?
测试脚本
(%2B是'+'的十六进制编码) > aws s3 ls 2022-07-13 10:29:36 0 %2B7000/ //尝试的命令 > aws s3 rm s3://namespace/ --exclude "*" --include "%2B7000/" > aws s3 rm s3://namespace/ --exclude "*" --include "*7000/" > aws s3 rm s3://namespace/ --exclude "*" --include "[+]7000/" > aws s3 rm s3://namespace/ --exclude "*" --include "'+7000'/" > aws s3 rm s3://namespace/"\+7000/" > aws s3 rm s3://namespace/%2B7000/ delete: s3://namespace/%2B7000/
大多数尝试都返回删除成功,但文件夹仍然存在。
aws s3api list-objects --bucket namespace 的输出
{ "Key": "+7000/", "LastModified": "2022-07-13T14:29:36.884Z", "ETag": "\"100\"", "Size": 0, "StorageClass": "STANDARD", "Owner": { "DisplayName": "vmsstg", "ID": "1-2-3-4" } }
解决方案
方法1:直接用s3api删除对象
S3中的“文件夹”本质是大小为0的对象,直接指定原始Key(+7000/)执行删除即可:
aws s3api delete-object --bucket namespace --key "+7000/"
注意给+7000/加引号,避免Shell解析特殊字符。
方法2:正确转义后使用s3 rm
如果坚持用s3 rm命令,可通过以下两种方式确保Shell正确传递原始字符:
- 用单引号包裹路径:
aws s3 rm 's3://namespace/+7000/'
- 用反斜杠转义
+:
aws s3 rm s3://namespace/\+7000/
方法3:批量处理脚本(适用于多个特殊字符空文件夹)
如果需要批量识别并删除桶内所有带特殊字符的空文件夹,可使用以下脚本:
#!/bin/bash BUCKET="namespace" # 列出所有大小为0的对象(即空文件夹标记) aws s3api list-objects-v2 --bucket $BUCKET --query "Contents[?Size==0].Key" --output text | while read KEY; do # 删除每个空对象 aws s3api delete-object --bucket $BUCKET --key "$KEY" echo "Deleted: $KEY" done
内容的提问来源于stack exchange,提问作者IbrahimMitko
相关产品推荐
相关产品推荐

