Aktualizacja
Jak wskazał alberge (+1), obecnie doskonały interfejs wiersza poleceń AWS zapewnia najbardziej wszechstronne podejście do interakcji z (prawie) wszystkimi funkcjami AWS - w międzyczasie obejmuje większość interfejsów API usług, a także udostępnia polecenia S3 wyższego poziomu do obsługi konkretnie przypadek użycia, zobacz dokumentację AWS CLI dla S3 :
- sync - Synchronizuje katalogi i prefiksy S3. Twój przypadek użycia jest omówiony w przykładzie 2 ( dostępne jest również bardziej szczegółowe użycie
--exclude
, --include
obsługa prefiksów itp.):
Następujące polecenie synchronizacji synchronizuje obiekty o określonym prefiksie i zasobniku z obiektami o innym określonym prefiksie i zasobniku, kopiując obiekty s3. […]
aws s3 sync s3://from_my_bucket s3://to_my_other_bucket
Dla kompletności wspomnę, że polecenia S3 niższego poziomu są nadal dostępne za pośrednictwem polecenia sub s3api , co pozwoliłoby bezpośrednio przetłumaczyć dowolne rozwiązanie oparte na SDK na interfejs wiersza poleceń AWS przed ostatecznym przyjęciem jego funkcjonalności wyższego poziomu.
Pierwsza odpowiedź
Przenoszenie plików między zasobnikami S3 można osiągnąć za pomocą PUT Object - Copy API (po którym następuje DELETE Object ):
Ta implementacja operacji PUT tworzy kopię obiektu, który jest już przechowywany w Amazon S3. Operacja kopiowania PUT jest taka sama, jak wykonanie operacji GET, a następnie PUT. Dodanie nagłówka żądania, x-amz-copy-source, powoduje, że operacja PUT kopiuje obiekt źródłowy do zasobnika docelowego. Źródło
Dostępne są odpowiednie przykłady dla wszystkich istniejących zestawów SDK AWS, patrz Kopiowanie obiektów w pojedynczej operacji . Oczywiście rozwiązanie oparte na skryptach byłoby tutaj oczywistym pierwszym wyborem, więc skopiuj obiekt przy użyciu AWS SDK dla Rubiego może być dobrym punktem wyjścia; jeśli wolisz zamiast tego Pythona, to samo można osiągnąć również za pomocą boto, oczywiście, zobacz metodę copy_key()
w dokumentacji API S3 boto .
PUT Object
kopiuje tylko pliki, więc DELETE Object
po udanej operacji kopiowania będziesz musiał jawnie usunąć plik przez nadal, ale będzie to tylko kilka wierszy po utworzeniu całego skryptu obsługującego nazwy zasobnika i plików (są też odpowiednie przykłady patrz np. usuwanie jednego obiektu na żądanie ).