Salin struktur direktori utuh ke AWS S3 bucket

40

Saya ingin menggunakan AWS S3 cli untuk menyalin struktur direktori lengkap ke ember S3.

Sejauh ini, semua yang saya coba salin file ke ember, tetapi struktur direktori runtuh. (untuk mengatakannya dengan cara lain, setiap file disalin ke direktori root ember)

Perintah yang saya gunakan adalah:

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

Saya juga telah mencoba meninggalkan garis miring pada penunjukan sumber saya (yaitu, salinan dari argumen). Saya juga menggunakan wildcard untuk menunjuk semua file ... setiap hal yang saya coba cukup menyalin file log ke direktori root ember.

agenv
sumber
3
Iya nih! Itu pasti jawabannya. Tidak seperti di Unix, perintah cp (dan perintah sinkronisasi) tidak membuat direktori target di sisi tujuan kecuali Anda meminta mereka melakukannya. Jadi jika Anda aws s3 cp --recursive mylocalsrcdir s3://bucket/kemudian hanya akan meletakkan file di repositori lokal Anda di "direktori root" ember Jika Anda melakukannya aws s3 cp --recursive mydirectory s3://bucket/mydirectorymaka itu akan menciptakan kembali struktur direktori pada akhir target.
agentv

Jawaban:

39

Saya percaya sinkronisasi adalah metode yang Anda inginkan. Coba ini sebagai gantinya:

aws s3 sync ./logdata s3://bucketname/
Chad Smith
sumber
4
... Saya bersemangat untuk mencobanya, tetapi itu memberi saya hasil yang sama dengan perintah cp. File-file dari direktori ./logfiles saya disalin ke "direktori" root di keranjang. Satu hal yang berhasil adalah mencoba ini: aws s3 sync ./logdata s3://bucketname/logdata Terima kasih atas petunjuknya. --- v
agentv
Sayangnya, bahkan dengan agen saran Anda, saya mendapatkan sinkronisasi hasil yang sama tidak mempertahankan struktur direktori dan hanya meratakan semuanya.
niharvey
UPDATE * - Nevermind struktur direktori saya menjadi kacau pada ekstrak
niharvey
9

Saya menghadapi kesalahan ini saat menggunakan salah satu dari perintah ini.

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

Saya bahkan berpikir untuk memasang bucket S3 secara lokal dan kemudian menjalankan rsync, bahkan yang gagal (atau macet selama beberapa jam) karena saya memiliki ribuan file.

Akhirnya, s3cmd bekerja seperti pesona.

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

Ini tidak hanya bekerja dengan baik dan menunjukkan output yang cukup jelas di konsol, tetapi juga mengunggah file besar di beberapa bagian.

vikas027
sumber
1
tl; dr: globbing file kartu liar bekerja lebih baik di s3cmd untuk saya. Sekeren aws-cli - untuk masalah manipulasi file S3 satu kali yang tidak langsung berfungsi seperti yang saya harapkan dan pikir mungkin - saya akhirnya menginstal dan menggunakan s3cmd. Apa pun sintaksis dan di balik layar yang berhasil saya bayangkan secara konseptual, s3cmd lebih intuitif dan mengakomodasi saya yang dipanggang dalam prasangka. Mungkin itu bukan jawaban Anda datang ke sini, tetapi itu berhasil untuk saya.
BradChesney79
Itu berguna @ BradChesney79
agentv
Akan bagus untuk menggambarkan opsi yang Anda gunakan pada perintah sinkronisasi. Juga tidak ada perintah "cp" untuk s3cmd? mengapa menggunakan sinkronisasi, bukan cp?
VinGarcia
4

Berikut ini bekerja untuk saya:

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

AWS kemudian akan "membuat" this_directorydan menyalin semua konten lokal ke dalamnya.

Michael Silverstein
sumber
2

Gunakan skrip berikut untuk menyalin struktur folder:

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
sumber
2

Saya tidak bisa s3 syncatau s3 cpbekerja pada folder 55 GB dengan ribuan file dan lebih dari 2 lusin subdirektori di dalamnya. Mencoba menyinkronkan seluruh folder hanya akan menyebabkan awscli gagal diam-diam tanpa mengunggah apa pun ke ember.

Akhirnya melakukan ini untuk pertama-tama menyinkronkan semua subdirektori dan kontennya (struktur folder dipertahankan):

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

Lalu saya melakukan ini untuk mendapatkan 30.000 file di tingkat atas:

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

Pastikan untuk menonton beban di server (protip yang dapat Anda gunakan wuntuk hanya menunjukkan beban) dan ctrl-zuntuk menunda perintah jika memuat terlalu tinggi. ( fguntuk melanjutkan lagi).

Menempatkan ini di sini kalau-kalau itu membantu siapa pun dalam situasi yang sama.

Catatan:

-mindepth 1 tidak termasuk .

-maxdepth 1mencegah menemukan dari daftar isi sub-direktori, karena s3 syncmenangani mereka dengan sukses.

cut -c 3- menghapus "./" dari awal setiap hasil dari find.

Twitney
sumber
1

Atau Anda juga dapat mencoba minio client alias mc

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

Semoga ini bisa membantu.

PS: Saya salah satu penyumbang proyek.

koolhead17
sumber
1
Kredit dimana kredit jatuh tempo: mc melakukan pekerjaan dan mempertahankan struktur dir - mengagumkan! Saya sudah kesal untuk menginstal> 200 megabyte Python & Pip omong kosong untuk menggunakan awscli dan membaca di sini bahwa itu runtuh struktur dir ..
joonas.fi
0

(Meningkatkan solusi Shishir )

  • Simpan skrip berikut dalam file (saya beri nama file 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
  • Jalankan sebagai berikut:
    /PATH/TO/s3Copy.sh /PATH/TO/ROOT/DIR/OF/SOURCE/FILESandDIRS PATH/OF/S3/BUCKET
    Misalnya jika s3Copy.shdisimpan di direktori home dan saya ingin menyalin semua file dan direktori yang berada di direktori saat ini, maka saya menjalankan ini:
    ~/s3Copy.sh . s3://XXX/myBucket

Anda dapat dengan mudah memodifikasi script untuk memungkinkan argumen lain s3 cpseperti --include, --exclude...

LoMaPh
sumber
Itu mengagumkan. Artisanal, sebenarnya.
agentv