Skopiuj nienaruszoną strukturę katalogów do segmentu AWS S3

38

Chcę użyć AWS S3 cli, aby skopiować pełną strukturę katalogów do segmentu S3.

Do tej pory wszystko, co próbowałem, kopiuje pliki do wiadra, ale struktura katalogów jest zwinięta. (inaczej mówiąc, każdy plik jest kopiowany do katalogu głównego wiadra)

Polecenie, którego używam to:

aws s3 cp --recursive ./logdata/ s3://bucketname/

Próbowałem także pominąć końcowy ukośnik na moim oznaczeniu źródłowym (tj. Kopii z argumentu). Użyłem również symbolu wieloznacznego do oznaczenia wszystkich plików ... próbuję po prostu skopiować pliki dziennika do katalogu głównego wiadra.

agentv
źródło
3
Tak! To zdecydowanie odpowiedź. W przeciwieństwie do Uniksa, polecenie cp (i polecenie synchronizacji) nie tworzy katalogu docelowego po stronie docelowej, chyba że poprosisz go o to. Więc jeśli aws s3 cp --recursive mylocalsrcdir s3://bucket/to zrobisz, po prostu umieści pliki w lokalnym repozytorium w „katalogu głównym” wiadra. Jeśli to zrobisz aws s3 cp --recursive mydirectory s3://bucket/mydirectory, odtworzy strukturę katalogów na docelowym końcu.
agentv 16.04.115

Odpowiedzi:

37

Wierzę, że synchronizacja jest metodą, którą chcesz. Spróbuj zamiast tego:

aws s3 sync ./logdata s3://bucketname/
Chad Smith
źródło
4
... Byłem podekscytowany, aby spróbować, ale dało to takie same wyniki jak polecenie cp. Pliki z mojego katalogu ./logfiles zostały skopiowane do głównego „katalogu” w wiadrze. Jedną z rzeczy, która zadziałała, było wypróbowanie tego: aws s3 sync ./logdata s3://bucketname/logdata dzięki za prowadzenie. --- v
agentv 16.04.15
niestety, nawet z twoim agentem sugestiiv dostałem ten sam wynik synchronizacja nie zachowała struktury katalogów i po prostu wszystko spłaszczyła.
niharvey
AKTUALIZACJA * - nieważne, że moja struktura katalogów została pomieszana podczas wyciągu
Niharvey
9

Napotkałem ten błąd podczas korzystania z jednego z tych poleceń.

$ aws s3 cp --recursive /local/dir s3://s3bucket/
OR
$ aws s3 sync /local/dir s3://s3bucket/

Pomyślałem nawet o zamontowaniu łyżki S3 lokalnie, a następnie uruchomieniu rsync, nawet jeśli się nie udało (lub zawiesiłem na kilka godzin), ponieważ mam tysiące plików.

Wreszcie s3cmd działało jak urok.

s3cmd sync /local/dir/ --delete-removed s3://s3bucket/ --exclude="some_file" --exclude="*directory*"  --progress --no-preserve

To nie tylko dobrze się sprawdza i pokazuje dość szczegółowe dane wyjściowe na konsoli, ale także przesyła duże pliki w częściach.

vikas027
źródło
1
tl; dr: globbing plików symboli dzikich działał dla mnie lepiej w s3cmd. Tak fajne, jak aws-cli - dla mojego jednorazowego problemu z manipulowaniem plikami S3, który nie działał od razu tak, jak chciałbym i myślałem, że może - skończyłem instalowanie i używanie s3cmd. Bez względu na składnię i scenę, którą wyobrażałem sobie, s3cmd był bardziej intuicyjny i przychylnie nastawiony do moich upartych uprzedzeń. Może nie jest to odpowiedź, po którą tu przybyłeś, ale dla mnie zadziałało.
BradChesney79
Przydaje się @ BradChesney79
agentv
Dobrze byłoby opisać opcje używane w poleceniu synchronizacji. Nie ma też polecenia „cp” dla s3cmd? po co używać synchronizacji zamiast cp?
VinGarcia,
4

Dla mnie działało:

aws s3 cp ~/this_directory s3://bucketname/this_directory --recursive

AWS „zrobi” this_directoryi skopiuje do niej całą zawartość lokalną.

Michael Silverstein
źródło
2

Użyj następującego skryptu do skopiowania struktury folderów:

s3Folder="s3://xyz.abc.com/asdf";

for entry in "$asset_directory"*
do
    echo "Processing - $entry"
    if [[ -d  $entry ]]; then
        echo "directory"
        aws s3 cp  --recursive "./$entry" "$s3Folder/$entry/"
    else
        echo "file"
        aws s3 cp "./$entry" "$s3Folder/"
    fi
done
Shishir Arora
źródło
2

Nie mogłem dostać s3 syncani s3 cppracować nad folderem o pojemności 55 GB z tysiącami plików i ponad 2 tuzinami podkatalogów. Próba zsynchronizowania całego folderu spowodowałaby tylko awarię awscli po cichu bez przesyłania niczego do wiadra.

Skończyło się na tym, aby najpierw zsynchronizować wszystkie podkatalogi i ich zawartość (struktura folderów została zachowana):

nice find . -mindepth 1 -maxdepth 1 -type d | cut -c 3- | while read line; do aws s3 sync $"$line" "s3://bucketname/$line"; done

Następnie zrobiłem to, aby uzyskać 30 000 plików na najwyższym poziomie:

nice find . -mindepth 1 -maxdepth 1 -type f | cut -c 3- | while read line; do aws s3 cp "$line" "s3://bucketname/";

Pamiętaj, aby obserwować obciążenie serwera (protip, którego możesz użyć, waby po prostu pokazać obciążenie) i ctrl-zzawiesić polecenie, jeśli obciążenie jest zbyt wysokie. ( fgaby kontynuować to ponownie).

Umieszczenie tego tutaj na wypadek, gdyby pomógł każdemu w podobnej sytuacji.

Uwagi:

-mindepth 1 wyklucza .

-maxdepth 1zapobiega znalezieniu przez podkatalogi zawartości podkatalogów, ponieważ s3 syncobsługuje je z powodzeniem.

cut -c 3- usuwa „./” z początku każdego wyniku z find.

twhitney
źródło
1

Możesz też wypróbować klienta minio, znanego również jako mc

$ mc cp Desktop/test/test/test.txt s3/miniocloud/Desktop/test/test/

Mam nadzieję, że to pomoże.

PS: Jestem jednym z współpracowników projektu.

koolhead17
źródło
1
Kredyt tam, gdzie należy się kredyt: mc wykonał zadanie i zachował strukturę katalogu - niesamowite! Byłem już wkurzony, że zainstalowałem> 200 megabajtów cracka w Pythonie i Pipie, żeby używać awscli i czytałem tutaj, że to zawala strukturę
katalogu
0

(Ulepszenie rozwiązania Shishir )

  • Zapisz następujący skrypt w pliku (nazwałem ten plik s3Copy.sh)
path=$1 # the path of the directory where the files and directories that need to be copied are located
s3Dir=$2 # the s3 bucket path

for entry in "$path"/*; do
    name=`echo $entry | sed 's/.*\///'`  # getting the name of the file or directory
    if [[ -d  $entry ]]; then  # if it is a directory
        aws s3 cp  --recursive "$name" "$s3Dir/$name/"
    else  # if it is a file
        aws s3 cp "$name" "$s3Dir/"
    fi
done
  • Uruchom w następujący sposób:
    /PATH/TO/s3Copy.sh /PATH/TO/ROOT/DIR/OF/SOURCE/FILESandDIRS PATH/OF/S3/BUCKET
    Na przykład, jeśli s3Copy.shjest przechowywany w katalogu osobistym i chcę skopiować wszystkie pliki i katalogi znajdujące się w bieżącym katalogu, uruchomię to:
    ~/s3Copy.sh . s3://XXX/myBucket

Można łatwo zmodyfikować skrypt, aby umożliwić innych argumentów s3 cp, takich jak --include, --exclude...

LoMaPh
źródło
To jest niesamowite. Rzemiosło, w rzeczywistości.
agentv