我有两个存储桶a
和b
。存储区b
包含a
中80%的对象。
我想将a
中剩余的20%对象复制到b
,而不将对象下载到本地存储。
我看到了AWS Command Line Interface,但正如我所知,它将所有对象从a
复制到b
,但正如我所说 - 我希望它只复制那些文件存在于a
但在b
中不存在。
答案 0 :(得分:4)
安装aws cli并使用访问凭据配置它
确保两个存储桶具有相同的目录结构
以下sync命令会同步指定前缀和下的对象 通过复制将桶存储到另一个指定前缀和存储桶下的对象 s3对象。如果两者的大小,s3对象将需要复制 s3对象不同,源的最后修改时间比新的更新 目标的最后修改时间,或s3对象没有 存在于指定的存储区和前缀目标下。在这 例如,用户将存储桶mybucket2同步到存储桶mybucket。 bucket mybucket包含对象test.txt和test2.txt。该 bucket mybucket2不包含任何对象:
aws s3 sync s3://mybucket s3://mybucket2
答案 1 :(得分:0)
您可以使用AWS SDK编写一个php或其他支持的语言脚本,它将从两个存储桶中创建文件名列表,使用array_diff找出不常见的文件,然后将文件从Bucket A复制到内存然后将文件放在Bucket B中。
这是一个很好的起点:https://aws.amazon.com/sdk-for-php/
更深入地创建文件名(键)数组:[http://docs.aws.amazon.com/AmazonS3/latest/dev/ListingObjectKeysUsingPHP.html][2]
一些用于检索密钥的代码
$objects = $s3->getIterator('ListObjects', array('Bucket' => $bucket));
foreach ($objects as $object) {
echo $object['Key'] . "\n";
}
Here describes how to move keys from bucket to bucket
// Instantiate the client.
$s3 = S3Client::factory();
// Copy an object.
$s3->copyObject(array(
'Bucket' => $targetBucket,
'Key' => $targetKeyname,
'CopySource' => "{$sourceBucket}/{$sourceKeyname}",
));
您将要从两个存储桶中提取密钥,然后执行array_diff以获取一组结果,然后您可以循环并传输这些密钥。希望这会有所帮助。