2013-07-03 5 views
15

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

मैं उत्सुक हूं कि अगर कोई पथ और फ़ाइल नाम दिया गया है तो यह जांचने का कोई तरीका है कि s3cmd का उपयोग कर S3 के भीतर मौजूद है या नहीं।

उत्तर

21

आप एस 3 सीएमडी में ls कमांड का उपयोग यह जानने के लिए कर सकते हैं कि फ़ाइल मौजूद है या नहीं।

बैश कोड

path=$1 
count=`s3cmd ls $path | wc -l` 

if [[ $count -gt 0 ]]; then 
     echo "exist" 
else 
     echo "do not exist" 
fi 

उपयोग: ./s3_exist.sh S3:

संपादित //foo/bar.txt:

cocoatomo के रूप में टिप्पणी में कहा, s3cmd ls $path सूचियों सभी फाइल $path से शुरू होता है। s3cmd info $path का उपयोग करने के लिए एक सुरक्षित दृष्टिकोण होगा और निकास कोड देखें।

न्यू बैश कोड

path=$1 
s3cmd info $path >/dev/null 2>&1 

if [[ $? -eq 0 ]]; then 
    echo "exist" 
else 
    echo "do not exist" 
fi 
+0

तो गिनती उस निर्देशिका के भीतर फ़ाइलों की संख्या है, मैं समझता हूं। हालांकि मैं -gt भाग में भाग नहीं लिया है और जब मैं इसे गुगल करने की कोशिश करता हूं तो कुछ भी नहीं मिल सकता है, क्या आप उस हिस्से को समझाते हैं? –

+1

किसी दिए गए पथ और फ़ाइल नाम से मेल खाने वाली फ़ाइलों की संख्या की गणना करें। चूंकि S3 डुप्लिकेट फ़ाइल नामों का समर्थन नहीं करता है, इसलिए यह गणना या तो 0 (फ़ाइल मौजूद नहीं है) या 1 (फ़ाइल मौजूद) होगी। "-gt" "से अधिक" के लिए खड़ा है। यदि आप यह आपके लिए अधिक स्पष्ट हैं तो आप [[$ count -eq 1]] भी कर सकते हैं। बैश में सशर्त अभिव्यक्ति के बारे में अधिक जानकारी के लिए: [link] (http://www.gnu.org/software/bash/manual/html_node/Bash-Conditional-Expressions.html) –

+0

"s3cmd ls" का पहला तर्क का अर्थ है एक बाल्टी नाम के बाद बाल्टी नाम या उपसर्ग स्ट्रिंग, फ़ाइल नाम नहीं। चूंकि "s3cmd ls s3: // foo/b" सूचियां "s3: //foo/bar.txt" यदि मौजूद है, "$ count -gt 0" यह नहीं दिखाता है कि s3: // foo/b मौजूद है या नहीं। – cocoatomo

2

कि bar.txt और bar.txt.bak मान लिया जाये कि एक बाल्टी S3 में मौजूद: // foo, "s3cmd ls S3: //foo/bar.txt" एक से पता चलता निम्नलिखित आउटपुट।

$ s3cmd ls s3://foo/bar.txt 
2013-11-11 11:11 5 s3://foo/bar.txt 
2013-11-11 11:11 5 s3://foo/bar.txt.bak 

चूंकि हमें कमांड परिणाम से दूसरी पंक्ति को हटा देना चाहिए, इसलिए हम अनावश्यक रेखाओं को फ़िल्टर करने के लिए "awk" कमांड का उपयोग करते हैं।

$ filename=s3://foo/bar.txt 
$ s3cmd ls ${filename} | awk "\$4 == \"${filename}\" { print \$4 }" 
2013-11-11 11:11 5 s3://foo/bar.txt 

अंत में, हम सभी आदेशों का निर्माण करते हैं।

filename=s3://foo/bar.txt 
count=$(s3cmd ls ${filename} | awk "\$4 == \"${filename}\" { print \$4 }" | wc -l) 

if [ $count -eq 0 ]; then 
    echo "file does not exist" 
else 
    echo "file exists" 
fi 
2

एडब्ल्यूएस CLI के नए संस्करण में, आप एक फ़ाइल या निर्देशिका के अस्तित्व का पता लगाने के लिए निम्न कोड का उपयोग कर सकते

count=$(aws s3 ls $path | wc -l) 
if [ $count -gt 0 ] 
then 
    (>&2 echo "$path already exists!") 
    return 
fi 
0

हम s3cmd ls उपयोग कर सकते हैं एक झंडा flag_exists सच अगर फाइल ले लो वहां फ़ाइल है और झूठी है अगर फाइल नहीं है।

FLAG_EXISTS=false 
    for j in $(s3cmd ls s3://abc//abc.txt); do 
     if [[ "$j" == "s3://abc//abc.txt" ]]; then 
     FLAG_EXISTS=true 
     break 
     fi 
    done 
    if [ "$FLAG_EXISTS" = false ]; then 
     echo 'file not exists' 
    else 
     echo 'file exists' 
    fi 

स्पष्टीकरण - के बाद से ls कई मूल्यों लौटा सकते हैं या यू abc.txt s3cmd ls के लिए खोज, तो यह abc.txt abcd.txt और इतने पर जैसे मूल्यों लौट सकते हैं की तरह है, तो पाशन और अगर हालत यदि का उपयोग कर जाँच फाइल मौजूद है।

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