Dizin yapısını bozulmadan AWS S3 kovasına kopyalayın


37

Tam bir dizin yapısını S3 bir kovaya kopyalamak için AWS S3 cli kullanmak istiyorum.

Şimdiye kadar, denediğim her şey, dosyaları kovaya kopyalar, ancak dizin yapısı daraltılır. (başka bir yolla söylemek gerekirse, her dosya kepçenin kök dizinine kopyalanır)

Kullandığım komut:

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

Ayrıca kaynak tanımlamamdaki (yani, argümandan kopya) sondaki kesik çizgiyi bırakmayı da denedim. Ayrıca tüm dosyaları belirlemek için bir joker kullandım ... denediğim her şey günlük dosyalarını sadece kovanın kök dizinine kopyalar.


3
Evet! Bu kesinlikle cevap. Unix'ten farklı olarak cp komutu (ve sync komutu), sizden yapmalarını istemediğiniz sürece, hedef tarafta bir hedef dizin oluşturmaz. Eğer aws s3 cp --recursive mylocalsrcdir s3://bucket/öyleyse, o zaman sadece yerel deponuzdaki dosyaları "root dizini" kovasına koyarsanız, aws s3 cp --recursive mydirectory s3://bucket/mydirectoryo zaman yaparsanız , hedef yapıdaki dizin yapısını yeniden yaratır.
agentv

Yanıtlar:


36

Senkronizasyonun istediğiniz yöntem olduğuna inanıyorum. Bunun yerine şunu deneyin:

aws s3 sync ./logdata s3://bucketname/

4
... bunu denediğim için heyecanlıydım, ama bana cp komutuyla aynı sonuçları verdi. ./Logfiles dizinindeki dosyalar, kovandaki "dizin" kök dizinine kopyalandı. İşe yarayan bir şey olsa bunu denemek oldu: aws s3 sync ./logdata s3://bucketname/logdata Lider için teşekkürler. --- v
agentv

maalesef, öneri aracınızla bile, aynı sonuç senkronizasyonu dizin yapısını korumadı ve her şeyi düzleştirdi.
niharvey

GÜNCELLEME * - Dizin
yapımın

8

Bu komutlardan birini kullanırken bu hatayla karşılaştım .

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

S3 kovasını yerel olarak monte etmeyi bile düşündüm ve daha sonra binlerce dosyaya sahip olduğum için başarısız oldu (ya da birkaç saat bekletilince bile) rsync'i çalıştırdım.

Sonunda, s3cmd bir cazibe gibi çalıştı.

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

Bu sadece işi iyi yapmakla kalmıyor ve konsolda oldukça ayrıntılı bir çıktı gösteriyor, aynı zamanda parçalara büyük dosyalar yüklüyor.


1
tl; dr: wild card file globbing s3cmd'de benim için daha iyi çalıştı. Aws-cli kadar soğuk - umarım ve umduğum gibi hemen işe yaramadı bir kerelik S3 dosya manipülasyon sorunum için-- s3cmd'yi yükleyip kullanmaya başladım. Kavramsal olarak hayal ettim, sahne arkası ne işliyorsa yapsın, s3cmd önyargılı olarak fırında pişirmek için daha sezgiseldi. Belki de buraya geldiğin cevap bu değildir, ama benim için işe yaradı.
BradChesney79

Bu yararlıdır @ BradChesney79
agentv 3

Sync komutunda kullandığınız seçenekleri açıklamak iyi olur. Ayrıca s3cmd için "cp" komutu yok mu? neden cp yerine sync kullanmalı?
VinGarcia

4

Aşağıdaki benim için çalıştı:

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

AWS daha sonra " this_directoryyerel " hale getirir ve içine tüm yerel içerikleri kopyalar.


2

Klasör yapısını kopyalamak için aşağıdaki betiği kullanın:

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

2

Ben alamadım s3 syncya s3 cpbinlerce dosya ve iç üzerinde 2 düzine alt dizinleri ile 55 GB klasörü işe. Tüm klasörü senkronize etmeye çalışmak awscli'nin kovaya hiçbir şey yüklemeden sessizce başarısız olmasına neden olacaktır.

Bunu, önce tüm alt dizinleri ve içeriklerini senkronize etmek üzere bitirdi (klasör yapısı korunuyor):

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

Sonra bunu 30.000 dosyayı en üst seviyeye çıkarmak için yaptım:

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

Sunucudaki yükü izlediğinizden emin olun ( wsadece yükü göstermek için kullanabileceğiniz koruyucu ) ve ctrl-zyük çok yükselirse komutu askıya aldığınızdan emin olun. ( fgtekrar devam etmek için).

Benzer bir durumda olan birine yardım etmesi durumunda bunu buraya koymak.

Notlar:

-mindepth 1 dışlayan .

-maxdepth 1s3 syncbunları başarılı bir şekilde ele aldığından alt dizinlerin içeriğini listelemeyi engeller .

cut -c 3- Bulunan her sonucun başındaki "./" işaretini kaldırır.


1

Alternatif olarak aka minio müşteri deneyebilirsiniz mc

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

Umarım yardım eder.

Not: Ben projeye katkıda bulunanlardan biriyim.


1
Kredi nedeniyle kredi: mc işini yaptı ve korunmuş dir yapısı - harika! Zaten ..> yüklemek için awscli kullanmak ve burada dir yapısını daraltır okumak için Python & Pip bok 200 megabayt kızgın
joonas.fi

0

( Shishir'in çözümünün iyileştirilmesi )

  • Aşağıdaki betiği bir dosyaya kaydedin (Dosyayı adlandırdım 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
  • Aşağıdaki gibi çalıştırın:
    /PATH/TO/s3Copy.sh /PATH/TO/ROOT/DIR/OF/SOURCE/FILESandDIRS PATH/OF/S3/BUCKET
    Örneğin s3Copy.sh, ana dizinde kayıtlıysa ve geçerli dizinde bulunan tüm dosyaları ve dizinleri kopyalamak istiyorsanız, şunu çalıştırın:
    ~/s3Copy.sh . s3://XXX/myBucket

Kolayca diğer argümanlar sağlamak için komut dosyasını s3 cpgibi --include, --exclude...


Bu harika. Aslında, esnaf.
agentv
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.