4

所以。我是个白痴。星期五,我以编程方式覆盖了一个存储桶中的大约 14,000 个文件,直到今天才意识到这一点。幸运的是,这些文件是版本化的。不幸的是,我找不到一个很好的清晰示例来说明如何编写脚本来遍历文件,然后恢复第二个最新版本。我一直在浏览 Boto 文档,我看到了如何删除版本,但不恢复。如果有人能给我一些代码来展示如何恢复特定版本,我很乐意使用 php 或 python。

4

1 回答 1

5

这需要您小心谨慎。我不想尝试为您提供完整的解决方案,因为我没有时间彻底测试它,也不想做出任何承诺。

但是,也许这会有所帮助。

首先,假设我们要在 boto 的特定存储桶中找到特定密钥的所有版本。我们可以这样做:

import boto

conn = boto.connect_s3()
bucket_name = 'mybucket'
key_name = 'mykey'

bucket = conn.lookup(bucket_name)
for k in bucket.list_versions(key_name):
    print(k.name, k.version_id, k.last_modified)

这应该打印出如下内容:

mykey TyvPH4UUD4zRnGhmmLH6HGHOcOnsJgQG 2013-03-03T19:10:39.000Z
mykey IxNYlmoyDsOSspR6SwuGVNM7Nr83ZTSI 2013-03-03T15:11:06.000Z
mykey XVI9_yxQYU6B2KXQv0VLj7luYOGwWCoh 2013-03-03T15:10:55.000Z
mykey qh0zjxWjRC8WvXQc_RmvVdCJ.S3gF2ui 2013-03-03T15:07:46.000Z

假设我们要“恢复”最旧的文件。为此,我们实际上将所需版本的对象复制回自身。在 boto 中,它看起来像这样:

bucket.copy_key(new_key_name=key_name, src_bucket_name=bucket_name, src_key_name=key_name, src_version_id='qh0zjxWjRC8WvXQc_RmvVdCJ.S3gF2ui')

这会将指定版本的密钥复制回同一存储桶中的自身。

我认为在松开脚本之前,您必须对此进行一些探索并进行大量测试。例如,您可以尝试将所需版本的对象复制到另一个存储桶中,并在复制到所需的存储桶之前查看您是否获得了所需的内容。

希望这可以帮助。

于 2013-04-16T01:32:36.820 回答