it-swarm.com.de

Überprüfen, ob sich eine Datei in einem S3-Bucket befindet, mithilfe von s3cmd

Ich habe ein Programm, das erfolgreich alle Dateien hochlädt, die ich benötige. Ich habe täglich neue Dateien, die ich hochladen muss. Nachdem ich die Dateien hochgeladen habe, brauche ich sie nicht mehr und suche daher nicht nach einer Synchronisierung. 

Ich bin neugierig, ob es einen Weg gibt, zu überprüfen, ob ein Pfad und ein Dateiname angegeben wurden, falls dies in S3 mithilfe von s3cmd vorhanden ist.

18
Tall Paul

Sie können den Befehl ls in s3cmd verwenden, um festzustellen, ob eine Datei in S3 vorhanden ist oder nicht.

Bash-Code

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

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

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

Bearbeiten:

Wie cocoatomo in Kommentaren darauf hinweist, listet s3cmd ls $path alle Dateien auf, die mit $path beginnen. Ein sicherer Ansatz wäre, s3cmd info $path zu verwenden und den Exit-Code zu überprüfen.

Neuer Bash-Code

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

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

Angenommen, dass bar.txt und bar.txt.bak in einem Bucket s3: // foo vorhanden sind, zeigt "s3cmd ls s3: //foo/bar.txt" eine folgende Ausgabe.

$ 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

Da wir die 2. Zeile aus dem Befehlsergebnis entfernen sollten, verwenden wir den Befehl "awk", um nicht benötigte Zeilen zu filtern.

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

Zum Schluss bauen wir alle Befehle auf.

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
cocoatomo

In der neueren Version von AWS CLI können Sie den folgenden Code verwenden, um das Vorhandensein einer Datei oder eines Verzeichnisses zu ermitteln

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

Wir können s3cmd ls verwenden. Nimm ein Flag. Flag_exists true, wenn Datei vorhanden ist, und false, wenn Datei nicht vorhanden ist.

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

Erläuterung - Da ls viele Werte zurückgeben kann, z. B. wenn nach s3cmd ls abc.txt gesucht wird, können Werte wie abc.txt abcd.txt usw. zurückgegeben werden. Verwenden Sie die if-Bedingung, wenn die Datei vorhanden ist. 

0
Arora20