2014-11-17 5 views
16
aws s3 cp "dist/myfile" "s3://my-bucket/production/myfile" 

यह हमेशा myfile को एस 3 पर प्रतिलिपि बनाता है - मैं केवल फाइल कॉपी करना चाहता हूं अगर यह अस्तित्व में नहीं है, अन्यथा त्रुटि फेंक दें। यह मेरे द्वारा कैसे हो सकता है? या कम से कम मैं यह जांचने के लिए awscli का उपयोग कैसे कर सकता हूं कि फ़ाइल मौजूद है या नहीं?सीपी फ़ाइल कैसे करें यदि यह अस्तित्व में नहीं है, तो अन्यथा त्रुटि फेंक दें?

+0

संबंधित: [जीएच -404] (https://github.com/aws/aws-cli/issues/404), [जीएच -1449] (https:/गिटहब में /github.com/aws/aws-cli/issues/1449) और [जीएच -2874] (https://github.com/aws/aws-cli/issues/2874)। – kenorb

उत्तर

19

आप फ़ाइल को सूचीबद्ध करके फ़ाइल के अस्तित्व के लिए परीक्षण कर सकते हैं और देख सकते हैं कि यह कुछ लौटाता है या नहीं। उदाहरण के लिए:

aws s3 ls s3://bucket/file.txt | wc -l 

यदि फ़ाइल मौजूद नहीं है तो यह शून्य (कोई लाइन नहीं) वापस आ जाएगी।


आप केवल एक फ़ाइल की प्रतिलिपि करने अगर यह नहीं है मौजूद, sync आदेश कोशिश चाहते हैं, उदाहरण के लिए:

aws s3 sync . s3://bucket/ --exclude '*' --include 'file.txt' 

इस दूरदराज के उद्देश्य के साथ स्थानीय फाइल सिंक्रनाइज़ करेगा, केवल अगर यह मौजूद नहीं है या स्थानीय फ़ाइल रिमोट ऑब्जेक्ट से अलग है तो इसे कॉपी कर रहा है।

+3

'aws s3 ls s3: //bucket/file.txt | wc -l' सटीक नहीं है - यह सटीक नाम के बजाय उस उपसर्ग के साथ फ़ाइलों को सूचीबद्ध करेगा। निम्न पर विचार करें: http://stackoverflow.com/a/17456170/391618 –

+6

सिंक फ़ाइलों पर काम नहीं करता है, केवल निर्देशिकाएं। – mgoldwasser

+0

@mgoldwasser अब फाइलों पर काम सिंक करता है? – olala

11

तो, यह पता चला है कि "aws s3 सिंक" फ़ाइलें नहीं करता है, केवल निर्देशिकाएं। यदि आप इसे एक फ़ाइल देते हैं, तो आपको ... दिलचस्प ... व्यवहार मिलता है, क्योंकि यह किसी भी चीज का व्यवहार करता है जो आप इसे एक निर्देशिका की तरह देते हैं और उस पर एक स्लैश फेंकता है। कम से कम aws-cli/1.6.7 पायथन/2.7.5 डार्विन/13.4.0 करता है।

%% date > test.txt 
    %% aws s3 sync test.txt s3://bucket/test.txt 
    warning: Skipping file /Users/draistrick/aws/test.txt/. File does not exist. 

इसलिए, यदि आप केवल -really- एक फ़ाइल सिंक करना चाहते हैं (केवल अपलोड करते हैं तो मौजूद है, और अगर चेकसम मेल खाता है) आप यह कर सकते हैं:

file="test.txt" 
    aws s3 sync --exclude '*' --include "$file" "$(dirname $file)" "s3://bucket/" 

नोट को बाहर/क्रम में शामिल हैं - यदि आप इसे उलट देते हैं, तो इसमें कुछ भी शामिल नहीं होगा। और आपके स्रोत और पथ को उनके मिलान के आस-पास सैनिटी रखने की आवश्यकता है, इसलिए शायद $ (बेसनाम $ फ़ाइल) के लिए क्रमबद्ध है - अगर आप पूर्ण पथ का उपयोग कर रहे हैं तो शामिल करें ... aws --debug s3 सिंक आपका मित्र है यह देखने के लिए कि मूल्यांकन कैसे शामिल है।

और भूलें कि लक्ष्य एक निर्देशिका कुंजी है, फ़ाइल कुंजी नहीं।

यहाँ एक काम कर उदाहरण है:

%% file="test.txt" 
    %% date >> $file 
    %% aws s3 sync --exclude '*' --include "$file" "$(dirname $file)" "s3://bucket/" 
    upload: ./test.txt to s3://bucket/test.txt/test.txt 
    %% aws s3 sync --exclude '*' --include "$file" "$(dirname $file)" "s3://bucket/" 
    %% date >> $file 
    %% aws s3 sync --exclude '*' --include "$file" "$(dirname $file)" "s3://bucket/" 
    upload: ./test.txt to s3://bucket/test.txt/test.txt 

(अब, अगर केवल वहाँ एडब्ल्यूएस S3 पूछने के लिए चेकसम को मान्य, ऐसा लगता है के बाद से हमेशा बहुखण्डीय शैली चेकसम करने के लिए -just- को .. ओह एक तरह से थे, हो सकता है कि कुछ - ड्रायर और कुछ आउटपुट स्क्रैपिंग और सिंक ..)

+0

अब फ़ाइलों पर सिंक काम करता है? – olala

+0

दस्तावेज़ों के अनुसार नहीं - http://docs.aws.amazon.com/cli/latest/reference/s3/sync.html 'सिंक निर्देशिका और एस 3 उपसर्ग ' – keen

+0

यह भी कहता है:" रिकर्सिवली से नई और अपडेट की गई फ़ाइलों की प्रतिलिपि बनाते हैं गंतव्य के लिए स्रोत निर्देशिका "। और मैंने कोशिश की है और ऐसा लगता है कि स्थानीय फाइल सिस्टम से फ़ाइलों को एस 3 में स्थानांतरित करना प्रतीत होता है। तो पहली बार स्थानांतरित करने का मतलब सिंक-इन नहीं है? – olala

2

यदि आप सूची सफल होते हैं तो केवल सूची और प्रतिलिपि करके आप इसे कर सकते हैं।

aws s3 ls "s3://my-bucket/production/myfile" || aws s3 cp "dist/myfile" "s3://my-bucket/production/myfile" 

संपादित करें: & & प्रतिस्थापित || को अगर सूची में विफल रहता है तो वांछित प्रभाव

+0

सत्य होने पर, यह एस 3 के लिए 2 कॉल बनाता है, अनुरोध की विफलता के लिए दो बार अवसर, और त्रुटि/पुनः प्रयास करने की आवश्यकता के लिए दोगुनी आवश्यकता ... – keen

+0

यह तर्कसंगत विपरीत है, यह फ़ाइल की प्रतिलिपि बनाता है पहले से ही है, कार्यात्मक रूप से यह हमेशा प्रतिलिपि बनाता है bs aws s3 ls फ़ाइल विफल नहीं होने पर विफल नहीं होता है –

संबंधित मुद्दे