2013-07-03 22 views
15

Mam program, który pomyślnie przesyła wszystkie potrzebne pliki. Mam codziennie nowe pliki, które muszę przesłać. Po przesłaniu plików nie są już potrzebne i dlatego nie chcę ich synchronizować.Sprawdzanie, czy plik jest w zasobniku S3 przy użyciu s3cmd

Jestem ciekawy, czy istnieje sposób sprawdzenia, czy podano ścieżkę i nazwę pliku, jeśli istnieje w S3 przy użyciu s3cmd.

Odpowiedz

21

Możesz użyć polecenia ls w s3cmd, aby sprawdzić, czy plik jest obecny w S3.

kod Bash

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

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

Zastosowanie: ./s3_exist.sh s3: //foo/bar.txt

EDIT:

Jak cocoatomo zauważył w komentarzach, s3cmd ls $path listy wszystkich plików to rozpoczyna się od$path. Bezpieczniejszym rozwiązaniem byłoby użycie s3cmd info $path i sprawdzenie kodu wyjścia.

New Bash kod

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

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

Tak więc jest to liczba plików w tym katalogu, rozumiem. Jednak nie natknąłem się na stronę -gt i nie mogę znaleźć nic, gdy próbowałem go uruchomić, czy mógłbyś wytłumaczyć tę część? –

+1

Policz liczbę plików pasujących do podanej ścieżki i nazwy pliku. Ponieważ S3 nie obsługuje zduplikowanych nazw plików, liczba ta będzie wynosić 0 (plik nie występuje) lub 1 (plik obecny). "-gt" oznacza "większy niż". Możesz również wykonać [[$ count -eq 1]], jeśli jest to bardziej zrozumiałe dla ciebie. Aby uzyskać więcej informacji o wyrażeniu warunkowym w Bash: [link] (http://www.gnu.org/software/bash/manual/html_node/Bash-Conditional-Expressions.html) –

+0

Pierwszy argument "s3cmd ls" oznacza nazwa zasobu lub ciąg prefiksu następujący po nazwie zasobu, a nie nazwa pliku. Ponieważ "s3cmd ls s3: // foo/b" wyświetla "s3: //foo/bar.txt" jeśli istnieje, "$ count -gt 0" nie pokazuje, czy s3: // foo/b istnieje czy nie. – cocoatomo

2

Zakładając, że bar.txt i bar.txt.bak istnieć w S3 wiadra: // foo "s3cmd ls s3: //foo/bar.txt" pokazuje następujące wyniki.

$ 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 

Ponieważ powinniśmy usunąć drugą linię z wyniku polecenia, używamy komendy "awk" do filtrowania niepotrzebnych linii.

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

Wreszcie, budujemy wszystkie polecenia.

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

W nowszej wersji AWS CLI, można użyć poniższy kod, żeby wykryć istnienie pliku lub katalogu

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

Możemy użyć s3cmd ls przyjąć jedną flag_exists flaga true, jeśli plik jest tam i false, jeśli nie ma tam pliku.

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 

Objaśnienie - Ponieważ ls może wrócić jak wiele wartości, jeśli u szukać s3cmd ls abc.txt, to może zwracać wartości jak abc.txt abcd.txt i tak dalej, więc pętli i sprawdzenie przy użyciu jeśli warunek jeśli plik istnieje.

Powiązane problemy