2015-08-11 3 views
0

У меня есть два ведра a и b. Ведро b содержит 80% объектов в a.Amazon S3/Слияние между двумя ведрами

Я хочу скопировать оставшиеся 20% объектов, которые в a в b, не загружая объекты в локальное хранилище.

Я видел AWS Command Line Interface, но, как я understant, это скопировать все объекты из a в b, но, как я сказал, - я хочу, что он будет копировать только те файлы, которые существуют в a, но не существует в b.

ответ

0

Вы можете использовать AWS SDK и написать php или другой поддерживаемый языковой скрипт, который будет составлять список имен файлов из обоих ковшей, использовать array_diff, чтобы узнать файлы, которые не являются общими, а затем скопировать файлы из Bucket A в память затем поместить файл в ведро 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, чтобы получить результирующий набор ключей, которые вы можете затем цикл через и передачи. Надеюсь это поможет.

+0

Is AWS Интерфейс командной строки не поддерживает эту функцию? Его действительно копирующий объект, который уже существует в ведре? – MiddleWare

+0

прочитайте команду cp в aws: http://docs.aws.amazon.com/cli/latest/reference/s3/cp.html, она скопирует ведро в ведро, которое может выполнить работу за вас, это будет просто напишите все файлы. Если вы хотите, чтобы он исключил файлы, вам, вероятно, придется написать сценарий оболочки, чтобы выполнить то, что я описал в php выше. –

3

Установка AWS командной строки и настроить его с учетными данными доступа

Убедитесь, что оба ведра имеют ту же структуру каталогов

AWS S3 docs

Следующая команда синхронизация синхронизирует объекты под определенным префиксом и ведра к объектам под другим заданным префиксом и ведром путем копирования s3 объектов. Объекту s3 требуется копирование, если размеры двух объектов s3 отличаются, последнее измененное время источника новее, чем , последнее измененное время назначения или объект s3 не существуют под указанным ведром и префиксом место назначения. В этом примере пользователь синхронизирует ведро mybucket2 с ковшом mybucket. Ведро mybucket содержит объекты test.txt и test2.txt. ведро mybucket2 не содержит объектов:

aws s3 sync s3://mybucket s3://mybucket2 
+0

Но этот экземпляр также содержит 80%, который уже существует в bucket 'b' – MiddleWare

+1

Нет, это будет синхронизировать только файлы в формате a, который не находится в b, просто убедитесь, что у двух ведер есть одна и та же структура каталогов или подкаталог. например s3: // /<подкатегория bucket>/s3: // /<подкатегория bucket> /, команда s3 sync действует аналогично rsync –

Смежные вопросы