从 AWS S3 中取消删除文件夹
Undelete folders from AWS S3
我有一个启用了版本控制的 S3 存储桶。可以取消删除文件,但是如何取消删除文件夹?
我知道,S3 没有文件夹...但是如何取消删除常用前缀?是否可以递归地取消删除文件?
您无法取消删除公共前缀。您需要一次取消删除一个对象。当一个对象出现时,任何关联的文件夹也会重新出现。
取消删除可以通过两种方式完成:
- 删除将撤销删除的删除标记,或
- 将对象的先前版本复制到自身,这将使最新版本比删除标记更新,因此它将再现。 (我希望你明白了!)
我找到了一个令人满意的解决方案 here, which is described in more details here。
综上所述,没有开箱即用的工具,但是一个简单的 bash 脚本包装了 AWS 工具 "s3api" 来实现递归取消删除。
该解决方案对我有用。我发现的唯一缺点是,亚马逊似乎会在大约 30.000 个文件后限制恢复操作。
我创建了这个简单的 bash 脚本来恢复我删除的 S3 文件夹中的所有文件:
#!/bin/bash
recoverfiles=$(aws s3api list-object-versions --bucket MyBucketName --prefix TheDeletedFolder/ --query "DeleteMarkers[?IsLatest && starts_with(LastModified,'yyyy-mm-dd')].{Key:Key,VersionId:VersionId}")
for row in $(echo "${recoverfiles}" | jq -c '.[]'); do
key=$(echo "${row}" | jq -r '.Key' )
versionId=$(echo "${row}" | jq -r '.VersionId' )
echo aws s3api delete-object --bucket MyBucketName --key $key --version-id $versionId
done
yyyy-mm-dd
= 文件夹被删除的日期
我有一个启用了版本控制的 S3 存储桶。可以取消删除文件,但是如何取消删除文件夹?
我知道,S3 没有文件夹...但是如何取消删除常用前缀?是否可以递归地取消删除文件?
您无法取消删除公共前缀。您需要一次取消删除一个对象。当一个对象出现时,任何关联的文件夹也会重新出现。
取消删除可以通过两种方式完成:
- 删除将撤销删除的删除标记,或
- 将对象的先前版本复制到自身,这将使最新版本比删除标记更新,因此它将再现。 (我希望你明白了!)
我找到了一个令人满意的解决方案 here, which is described in more details here。
综上所述,没有开箱即用的工具,但是一个简单的 bash 脚本包装了 AWS 工具 "s3api" 来实现递归取消删除。
该解决方案对我有用。我发现的唯一缺点是,亚马逊似乎会在大约 30.000 个文件后限制恢复操作。
我创建了这个简单的 bash 脚本来恢复我删除的 S3 文件夹中的所有文件:
#!/bin/bash
recoverfiles=$(aws s3api list-object-versions --bucket MyBucketName --prefix TheDeletedFolder/ --query "DeleteMarkers[?IsLatest && starts_with(LastModified,'yyyy-mm-dd')].{Key:Key,VersionId:VersionId}")
for row in $(echo "${recoverfiles}" | jq -c '.[]'); do
key=$(echo "${row}" | jq -r '.Key' )
versionId=$(echo "${row}" | jq -r '.VersionId' )
echo aws s3api delete-object --bucket MyBucketName --key $key --version-id $versionId
done
yyyy-mm-dd
= 文件夹被删除的日期