2013-07-03 25 views
15

İhtiyacım olan tüm dosyaları başarıyla yükleyen bir programım var. Her gün yüklemem gereken yeni dosyam var. Dosyaları yükledikten sonra onlara artık ihtiyacım yok ve onları senkronize etmek istemiyorum.Bir s3cmd s3cmd kullanarak bir dosyada olup olmadığını kontrol etme

S3 içinde s3cmd'yi kullanıyorsa bir yol ve dosya adı verilip verilmediğini kontrol etmenin bir yolu olup olmadığını merak ediyorum.

cevap

21

Bir dosyanın var olup olmadığını öğrenmek için s3cmd'deki ls komutunu S3'te kullanabilirsiniz.

Bash kodu

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

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

Kullanımı: ./s3_exist.sh s3:

Düzenleme //foo/bar.txt: cocoatomo olarak

Açıklamalarda belirttiği, s3cmd ls $path listeleri tüm dosya Bu ,$path ile başlar. Daha güvenli bir yaklaşım, s3cmd info $path'u kullanmak ve çıkış kodunu kontrol etmek olacaktır.

Yeni Bash kodu

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

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

Dolayısıyla, bu dizindeki dosyaların sayısı sayılır, anlıyorum. Bununla birlikte, -gt bölümüne rastlamamıştım ve googling yapmaya çalıştığımda hiçbir şey bulamıyordum, bu kısmı açıklamak ister misiniz? –

+1

Belirli bir yol ve dosya adıyla eşleşen dosya sayısını sayın. S3 çift dosya isimlerini desteklemediğinden, bu sayım 0 (dosya mevcut değil) veya 1 (dosya mevcut) olacaktır. "-gt", "daha büyük" anlamına gelir. Bu sizin için daha açıksa [[$ count -eq 1]] işlemini de yapabilirsiniz. Bash'de koşullu ifade hakkında daha fazla bilgi için: [link] (http://www.gnu.org/software/bash/manual/html_node/Bash-Conditional-Expressions.html) –

+0

"s3cmd ls" nin ilk argümanı, Bir grup adı, bir dosya adı değil, bir kova adı veya bir önek dizesi. Varsa "s3cmd ls s3: // foo/b" listeler "s3: //foo/bar.txt", "$ count -gt 0", s3: // foo/b'nin var olup olmadığını göstermez. – cocoatomo

2

o bar.txt ve bar.txt.bak varsayarsak bir kova s3 var: // foo, "s3cmd ls s3: //foo/bar.txt" Bir gösteriyor çıkıştan sonra.

$ 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 

biz komut sonucundan 2 çizgiyi kaldırmak gerektiğinden, biz gereksiz satırları filtrelemek için "awk" komutunu kullanın.

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

Son olarak, tüm komutları oluşturmak. AWS CLI yeni sürümünde

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

, bir dosya veya dizinin varlığını tespit etmek için aşağıdaki kodu kullanabilirsiniz

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

Biz s3cmd ls kullanmak dosya halinde tek bayrak flag_exists gerçek Take olabilir Dosya yoksa orada ve yanlıştır.

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 

Açıklama - u abc.txt s3cmd ls için arama yaparsanız, o zaman çok döngü ve durum eğer kullanılarak kontrol abc.txt abcd.txt ve benzeri gibi değerleri dönebilirsiniz gibi ls birçok değerleri dönebilirsiniz yana dosya var.

İlgili konular