我有一个拥有一堆旧文件的S3存储桶。我刚刚开启了版本控制,并试图找出这种遗留文件的删除保护类型,与自切换后上传的新文件相比。这是一些示例代码:
import boto
c = boto.connect_s3()
bucket = c.get_bucket('my-bucket')
pfx='myfolder/subfolder/'
i = 0
for k in bucket.list_versions(prefix=pfx):
if type(k) == boto.s3.deletemarker.DeleteMarker:
print "DM %s %s" % (k.name, k.version_id)
else:
s = k.get_contents_as_string()
print "REG %s %s %d" % (k.name, k.version_id, len(s))
pfx
包含一些遗留文件,所以第一次运行时我得到的是这样的:
REG myfolder/subfolder/ null 0
REG myfolder/subfolder/f1 null 369
REG myfolder/subfolder/f2 null 427
REG myfolder/subfolder/f3 null 141
然后我使用f2
工具删除了S3Browser
。当我重新编写上面的代码时,我得到了这个:
REG myfolder/subfolder/ null 0
REG myfolder/subfolder/f1 null 369
DM myfolder/subfolder/f2 KPNaxqBeIrCGKUx3tYUsRDwWzKbX06
REG myfolder/subfolder/f2 null 427
REG myfolder/subfolder/f3 null 141
问题是:有没有办法检索/取消删除我刚刚删除的f2
版本?
答案 0 :(得分:1)
在以前无版本的存储桶上启用版本控制可以对现有对象提供与新对象完全相同的删除保护,只有一个小的区别......这种差异在输出中可见,但很难首先要理解。
版本化存储桶中版本化对象的每个版本都有一个版本ID,当您删除最新版本时,它会被删除标记替换,后者会获得新版本ID。要访问旧版本,请通过其版本ID访问它,或删除删除标记。所有这些,你已经知道了。
不同之处在于,当您启用版本控制时,所有现有的非版本化对象实际上都会获得版本ID,而版本ID实际上是" null。"不是" null"如在"价值不存在"在三值逻辑意义上,但实际上是4个字节n u l l
。您可以使用此版本ID访问对象,方法与访问任何版本化对象的密钥和版本ID相同。
答案 1 :(得分:0)
在存储桶上启用版本控制后,将为存储桶中的所有对象启用它。删除的任何对象,无论是在版本控制之前还是之后创建,都将导致将DeleteMarker写入存储桶。除非您明确执行版本化删除操作,否则该对象以及该对象的任何先前版本仍将存在。
因此,如果您在该存储桶上调用list_versions(prefix='myfolder/subfolder/f2')
,则应该为剩余的版本返回Key
个对象。您应该能够使用Key
对象的常规方法来检索对象的内容。