คัดลอกโครงสร้างไดเรกทอรีไม่บุบสลาย AWS S3


37

ฉันต้องการใช้ cls AWS S3 เพื่อคัดลอกโครงสร้างไดเรกทอรีแบบเต็มไปยังที่ฝากข้อมูล S3

ถึงตอนนี้ทุกสิ่งที่ฉันได้ลองคัดลอกไฟล์ไปยังที่ฝากข้อมูล แต่โครงสร้างไดเรกทอรีถูกยุบ (เพื่อบอกอีกวิธีหนึ่งไฟล์แต่ละไฟล์จะถูกคัดลอกไปยังไดเรกทอรีรากของที่เก็บข้อมูล)

คำสั่งที่ฉันใช้คือ:

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

ฉันยังได้ลองทิ้งเครื่องหมายทับต่อท้ายที่ชื่อแหล่งที่มาของฉัน (เช่นสำเนาจากอาร์กิวเมนต์) ฉันยังใช้สัญลักษณ์แทนเพื่อกำหนดไฟล์ทั้งหมด ... แต่ละสิ่งที่ฉันลองคัดลอกไฟล์บันทึกไปยังไดเรกทอรีรากของที่เก็บข้อมูล


3
ใช่ นั่นคือคำตอบที่แน่นอน ไม่เหมือนใน Unix คำสั่ง cp (และคำสั่ง sync) จะไม่สร้างไดเรกทอรีเป้าหมายทางด้านปลายทางเว้นแต่คุณจะขอให้พวกเขาทำเช่นนั้น ดังนั้นหากคุณaws s3 cp --recursive mylocalsrcdir s3://bucket/แล้วมันจะวางไฟล์ลงในที่เก็บในเครื่องของคุณใน bucket "root directory" ถ้าคุณทำaws s3 cp --recursive mydirectory s3://bucket/mydirectoryมันจะสร้างโครงสร้างไดเรกทอรีขึ้นใหม่ที่ปลายทางเป้าหมาย
agentv

คำตอบ:


36

ฉันเชื่อว่าการซิงค์เป็นวิธีที่คุณต้องการ ลองใช้สิ่งนี้แทน:

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

4
... ฉันรู้สึกตื่นเต้นที่จะลองทำสิ่งนี้ แต่มันก็ให้ผลลัพธ์เหมือนกับคำสั่ง cp ไฟล์จากไดเรกทอรี. / logfiles ของฉันถูกคัดลอกไปยังราก "ไดเรกทอรี" ในที่เก็บข้อมูล สิ่งหนึ่งที่ใช้ได้ผลก็คือลองทำสิ่งนี้: aws s3 sync ./logdata s3://bucketname/logdata ขอบคุณสำหรับการนำ --- v
agentv

โชคไม่ดีที่ถึงแม้จะมี agent agent ข้อเสนอแนะของคุณฉันก็ยังได้ผลลัพธ์การซิงค์ที่เหมือนกันไม่ได้รักษาโครงสร้างไดเรกทอรีและทำให้ทุกอย่างแบนออก
niharvey

UPDATE * - ไม่ต้องสนใจโครงสร้างไดเรกทอรีของฉันที่สับสนในสารสกัด
niharvey

8

ฉันประสบข้อผิดพลาดนี้ขณะใช้คำสั่งใดคำสั่งหนึ่ง

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

ฉันยังนึกถึงการติดตั้ง S3 bucket ในเครื่องแล้วเรียกใช้ rsync แม้ว่ามันจะล้มเหลว

ในที่สุดs3cmdทำงานเหมือนมีเสน่ห์

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

สิ่งนี้ไม่เพียงทำงานได้ดีและแสดงผลลัพธ์ที่ค่อนข้างละเอียดบนคอนโซล แต่ยังอัปโหลดไฟล์ขนาดใหญ่ในส่วนต่างๆ


1
tl; dr: ไฟล์ wild card globbing ทำงานได้ดีขึ้นใน s3cmd สำหรับฉัน เท่ห์เหมือน aws-cli - สำหรับปัญหาการจัดการไฟล์ S3 ครั้งเดียวของฉันที่ไม่ได้ทำงานทันทีที่ฉันคาดหวังและคิดว่ามันอาจเป็น - ฉันสิ้นสุดการติดตั้งและใช้ s3cmd ไม่ว่าไวยากรณ์และเบื้องหลังจะทำงานอย่างไรฉันก็จินตนาการถึงแนวคิด s3cmd นั้นใช้งานได้ง่ายกว่าและเอื้ออำนวยต่อการอบในความคิดของฉัน อาจไม่ใช่คำตอบที่คุณมาที่นี่ แต่มันก็ใช้ได้กับฉัน
BradChesney79

นั่นเป็นประโยชน์ @ BradChesney79
agentv

เป็นการดีที่จะอธิบายตัวเลือกที่คุณใช้ในคำสั่งการซิงค์ นอกจากนี้ยังไม่มีคำสั่ง "cp" สำหรับ s3cmd? เหตุใดจึงใช้การซิงค์แทน cp
VinGarcia

4

การทำงานต่อไปนี้สำหรับฉัน:

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

จากนั้น AWS จะ "สร้าง" this_directoryและคัดลอกเนื้อหาท้องถิ่นทั้งหมดลงใน


2

ใช้สคริปต์ต่อไปนี้สำหรับการคัดลอกโครงสร้างโฟลเดอร์:

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

ฉันไม่สามารถรับs3 syncหรือs3 cpทำงานบนโฟลเดอร์ 55 GB ที่มีไฟล์นับพันและไดเรกทอรีย่อยมากกว่า 2 โหล การพยายามซิงค์โฟลเดอร์ทั้งหมดจะทำให้ awscli ล้มเหลวอย่างเงียบ ๆ โดยไม่ต้องอัปโหลดอะไรไปที่ที่เก็บข้อมูล

จบลงด้วยการทำเช่นนี้เพื่อซิงค์ไดเรกทอรีย่อยทั้งหมดและเนื้อหาของพวกเขา (โครงสร้างโฟลเดอร์ถูกเก็บรักษาไว้):

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

จากนั้นฉันก็ทำเช่นนี้เพื่อรับไฟล์ 30,000 ไฟล์ในระดับบนสุด:

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

ตรวจสอบให้แน่ใจว่าได้ดูการโหลดบนเซิร์ฟเวอร์ (protip คุณสามารถใช้wเพื่อแสดงการโหลด) และctrl-zหยุดคำสั่งหากโหลดสูงเกินไป ( fgเพื่อดำเนินการต่ออีกครั้ง)

วางที่นี่ในกรณีที่มันช่วยให้ทุกคนในสถานการณ์ที่คล้ายกัน

หมายเหตุ:

-mindepth 1 ไม่รวม .

-maxdepth 1ป้องกันการค้นหาจากการแสดงรายการเนื้อหาของไดเรกทอรีย่อยเนื่องจากs3 syncจัดการสิ่งเหล่านั้นได้สำเร็จ

cut -c 3- ลบ "./" ออกจากจุดเริ่มต้นของผลการค้นหาแต่ละรายการ


1

หรือคุณสามารถลองใช้ไคลเอนต์ minio aka mc

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

หวังว่ามันจะช่วย

PS: ฉันเป็นหนึ่งในผู้มีส่วนร่วมในโครงการ


1
เครดิตที่เครดิตครบกำหนด: mc ทำงานและรักษาโครงสร้าง dir - ยอดเยี่ยม! ฉันโกรธไปติดตั้ง> Python & Pip crap 200 เมกะไบต์เพื่อใช้ awscli และอ่านที่นี่ว่ามันพังโครงสร้าง dir ..
joonas.fi

0

(ปรับปรุงการแก้ปัญหาของShishir )

  • บันทึกสคริปต์ต่อไปนี้ในไฟล์ (ฉันตั้งชื่อไฟล์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
  • เรียกใช้ดังนี้:
    /PATH/TO/s3Copy.sh /PATH/TO/ROOT/DIR/OF/SOURCE/FILESandDIRS PATH/OF/S3/BUCKET
    ตัวอย่างเช่นถ้าs3Copy.shเก็บไว้ในโฮมไดเร็กตอรี่และฉันต้องการคัดลอกไฟล์และไดเร็กตอรี่ทั้งหมดที่อยู่ในไดเรคทอรีปัจจุบัน, จากนั้นฉันก็รันสิ่งนี้:
    ~/s3Copy.sh . s3://XXX/myBucket

คุณสามารถปรับเปลี่ยนได้อย่างง่ายดายสคริปต์เพื่อให้การขัดแย้งอื่น ๆs3 cpเช่น--include, --exclude...


นั่นช่างยอดเยี่ยม ในความเป็นจริง Artisanal
agentv
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.