AWS S3 बाल्टी के लिए निर्देशिका संरचना की प्रतिलिपि बनाएँ


38

मैं एक S3 बाल्टी में पूर्ण निर्देशिका संरचना की प्रतिलिपि बनाने के लिए AWS S3 cli का उपयोग करना चाहता हूं।

अब तक, मैंने जो कुछ भी करने की कोशिश की है वह फाइलों को बाल्टी में कॉपी करता है, लेकिन निर्देशिका संरचना ढह गई है। (इसे दूसरे तरीके से कहने के लिए, प्रत्येक फ़ाइल को बाल्टी की मूल निर्देशिका में कॉपी किया जाता है)

मेरे द्वारा उपयोग की जाने वाली कमांड है:

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

मैंने अपने स्रोत पदनाम (यानी, तर्क से प्रतिलिपि) पर पीछे चल रहे स्लैश को छोड़ने की कोशिश की है। मैंने सभी फ़ाइलों को नामित करने के लिए एक वाइल्डकार्ड का भी उपयोग किया है ... प्रत्येक चीज़ जो मैं कोशिश करता हूं कि बस लॉग फ़ाइलों को बाल्टी की मूल निर्देशिका में कॉपी करता हूं।


3
हाँ! यह निश्चित रूप से जवाब है। यूनिक्स के विपरीत, cp कमांड (और सिंक कमांड) गंतव्य पक्ष पर एक लक्ष्य निर्देशिका नहीं बनाते हैं जब तक कि आप उन्हें ऐसा करने के लिए नहीं कहते हैं। तो अगर आप aws s3 cp --recursive mylocalsrcdir s3://bucket/तब यह फाइल को अपने स्थानीय भंडार में बाल्टी "रूट डायरेक्टरी" में डाल देंगे, यदि आप ऐसा करते हैं aws s3 cp --recursive mydirectory s3://bucket/mydirectoryतो यह टार्गेट एंड पर डायरेक्टरी स्ट्रक्चर को रीक्रिएट करेगा।
एजेंटव

जवाबों:


37

मेरा मानना ​​है कि सिंक वह विधि है जो आप चाहते हैं। इसके बजाय यह प्रयास करें:

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

4
... मैं यह कोशिश करने के लिए उत्साहित था, लेकिन इसने मुझे cp कमांड के समान परिणाम दिए। मेरी ./logfiles निर्देशिका की फ़ाइलों को बाल्टी में रूट "निर्देशिका" में कॉपी किया गया था। एक बात जो काम की थी, हालांकि यह कोशिश करना था: aws s3 sync ./logdata s3://bucketname/logdata लीड के लिए धन्यवाद। --- वि
एजेंट्व १६'१५

दुर्भाग्य से, यहां तक ​​कि आपके सुझाव के साथ मैं भी एक ही परिणाम सिंक मिला निर्देशिका संरचना को संरक्षित नहीं किया और बस सब कुछ समतल कर दिया।
niharvey

अद्यतन * - कभी नहीं मेरी निर्देशिका संरचना निकालने पर गड़बड़ हो गया
niharvey

9

मैंने इनमें से किसी भी कमांड का उपयोग करते समय इस त्रुटि का सामना किया था ।

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

मैंने भी स्थानीय रूप से S3 बाल्टी को माउंट करने के बारे में सोचा और फिर rsync चलाया, यहां तक ​​कि वह विफल हो गई (या कुछ घंटों के लिए लटका दिया गया) क्योंकि मेरे पास हजारों फ़ाइल हैं।

अंत में, s3cmd ने एक आकर्षण की तरह काम किया।

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

यह न केवल काम अच्छा करता है और कंसोल पर काफी वर्बोज़ आउटपुट दिखाता है, बल्कि भागों में बड़ी फ़ाइलों को भी अपलोड करता है।


1
tl; dr: वाइल्ड कार्ड फ़ाइल ग्लोबिंग ने मेरे लिए s3cmd में बेहतर काम किया। के रूप में शांत aws-cli के रूप में है - के लिए मेरी एक बार S3 फ़ाइल हेरफेर मुद्दा है कि तुरंत काम नहीं किया के रूप में मैं आशा करता था और सोचा कि यह हो सकता है - मैं स्थापित करने और s3cmd का उपयोग कर समाप्त हो गया। जो कुछ भी वाक्य रचना और पर्दे के पीछे मैंने कल्पना की थी, s3cmd अधिक सहज और पूर्व धारणाओं में मेरे बेक किए गए थे। हो सकता है कि यह वह उत्तर न हो जिसके लिए आप यहां आए थे, लेकिन इसने मेरे लिए काम किया।
ब्रैडकिसने79

यह उपयोगी है @ BradChesney79
Agentv

सिंक कमांड पर आपके द्वारा उपयोग किए जा रहे विकल्पों का वर्णन करना अच्छा होगा। इसके अलावा s3cmd के लिए कोई "cp" कमांड नहीं है? सीपी के बजाय सिंक का उपयोग क्यों करें?
विनर्जिया

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

मैं हजारों फाइलों और 2 दर्जन से अधिक उपनिर्देशिकाओं के साथ 55 जीबी फ़ोल्डर पर काम करने s3 syncया s3 cpकरने के लिए नहीं मिल सका । पूरे फोल्डर को सिंक करने की कोशिश करने से सिर्फ अस्कली को बाल्टी में कुछ भी अपलोड किए बिना चुपचाप विफल होने का कारण होगा।

सभी उपनिर्देशिकाओं और उनकी सामग्री (फ़ोल्डर संरचना संरक्षित है) को पहले सिंक करने के लिए ऐसा करने पर समाप्त:

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/";

सर्वर पर लोड देखना सुनिश्चित करें (जो आप wकेवल लोड दिखाने के लिए उपयोग कर सकते हैं ) ( ctrl-zयदि लोड बहुत अधिक हो जाता है तो कमांड को स्थगित करना। ( fgइसे फिर से जारी रखने के लिए)।

इस मामले में यहाँ डाल यह एक समान स्थिति में किसी को भी मदद करता है।

टिप्पणियाँ:

-mindepth 1 शामिल नहीं .

-maxdepth 1उप-निर्देशिका की सामग्री को सूचीबद्ध करने से रोकता है, क्योंकि s3 syncवे सफलतापूर्वक संभालते हैं।

cut -c 3- खोज से प्रत्येक परिणाम की शुरुआत से "./" हटाता है।


1

वैकल्पिक रूप से आप मिनियो क्लाइंट उर्फ एमसी को भी आज़मा सकते हैं

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

आशा है कि यह मदद करेगा।

पुनश्च: मैं परियोजना में योगदानकर्ता में से एक हूं।


1
क्रेडिट जहां क्रेडिट देय है: एमसी ने काम किया और डीआईआर संरचना को संरक्षित किया - भयानक! मैं पहले से ही स्थापित करने के लिए तैयार था> 200 मेगाबाइट्स पायथन और पिप बकवास की awscli का उपयोग करने के लिए और यहाँ पढ़ने के लिए कि यह dir संरचना को ध्वस्त करता है ..
joonas.fi

0

( शिशिर के समाधान में सुधार )

  • फ़ाइल में निम्न स्क्रिप्ट सहेजें (मैंने फ़ाइल का नाम दिया है 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...


बहुत शानदार है। कारीगर, वास्तव में।
एजेंटव
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.