是否可以使用s3cmd将所有文件从一个S3存储桶复制到另一个存储桶?

Jan*_*ard 75 copy amazon-s3 amazon-web-services

我对s3cmd很满意,但有一个问题:如何将所有文件从一个S3存储桶复制到另一个?它甚至可能吗?

编辑:我发现了一种使用Python与boto在存储桶之间复制文件的方法:

from boto.s3.connection import S3Connection

def copyBucket(srcBucketName, dstBucketName, maxKeys = 100):
  conn = S3Connection(awsAccessKey, awsSecretKey)

  srcBucket = conn.get_bucket(srcBucketName);
  dstBucket = conn.get_bucket(dstBucketName);

  resultMarker = ''
  while True:
    keys = srcBucket.get_all_keys(max_keys = maxKeys, marker = resultMarker)

    for k in keys:
      print 'Copying ' + k.key + ' from ' + srcBucketName + ' to ' + dstBucketName

      t0 = time.clock()
      dstBucket.copy_key(k.key, srcBucketName, k.key)
      print time.clock() - t0, ' seconds'

    if len(keys) < maxKeys:
      print 'Done'
      break

    resultMarker = keys[maxKeys - 1].key
Run Code Online (Sandbox Code Playgroud)

同步几乎与复制一样简单.ETag,大小和最后修改的字段可用于键.

也许这对其他人也有帮助.

ami*_*ena 90

s3cmd sync s3://from/this/bucket/ s3://to/this/bucket/

有关可用选项,请使用: $s3cmd --help

  • 你也可以使用aws cli来做到这一点.aws s3 sync s3:// from/s3:// to / (12认同)
  • 如果每个存储桶都有一组不同的访问密钥 ID 和秘密(不同的 AWS 账户)怎么办? (2认同)

pyt*_*981 43

AWS CLI似乎完美地完成了这项工作,并且具有成为官方支持工具的好处.

aws s3 sync s3://mybucket s3://backup-mybucket
Run Code Online (Sandbox Code Playgroud)

http://docs.aws.amazon.com/cli/latest/reference/s3/sync.html


mda*_*man 29

在我写这篇文章时,最热门投票的答案是这样的:

s3cmd sync s3://from/this/bucket s3://to/this/bucket
Run Code Online (Sandbox Code Playgroud)

这是一个有用的答案.但有时同步不是你需要的(它删除文件等).我花了很长时间才弄清楚这种非脚本替代方案,只需在桶之间复制多个文件.(好吧,在下面显示的情况下,它不在存储桶之间.它位于非真实文件夹之间,但它在存储桶之间同样有效.)

# Slightly verbose, slightly unintuitive, very useful:
s3cmd cp --recursive --exclude=* --include=file_prefix* s3://semarchy-inc/source1/ s3://semarchy-inc/target/
Run Code Online (Sandbox Code Playgroud)

上述命令的说明:

  • -recursive
    在我看来,我的要求不是递归的.我只想要多个文件.但是在这种情况下递归只是告诉s3cmd cp来处理多个文件.大.
  • -exclude
    这是一个奇怪的方式来思考这个问题.首先递归选择所有文件.接下来,排除所有文件.等等,什么?
  • - 包括
    现在我们正在谈论.指示要包括的文件前缀(或后缀或任何模式).
    s3://sourceBucket/ s3://targetBucket/
    这部分足够直观.虽然从技术上讲它似乎违反了s3cmd帮助中记录的示例,该示例表明必须指定源对象:
    s3cmd cp s3://BUCKET1/OBJECT1 s3://BUCKET2[/OBJECT2]


小智 8

我需要复制一个非常大的存储桶,因此我将问题中的代码调整为多线程版本并将其放在GitHub上.

https://github.com/paultuckey/s3-bucket-to-bucket-copy-py


小智 8

您也可以使用Web界面执行此操作:

  1. 转到Web界面中的源存储桶.
  2. 标记要复制的文件(使用shift和鼠标单击标记几个).
  3. 按操作 - >复制.
  4. 转到目标存储桶.
  5. 按操作 - >粘贴.

而已.