web-dev-qa-db-fra.com

AWS S3: Comment vérifier si un fichier existe dans un compartiment à l'aide de bash

Je voudrais savoir s'il est possible de vérifier s'il y a certains fichiers dans un certain compartiment.

C'est ce que j'ai trouvé:

Vérification de la présence d'un fichier dans un compartiment S3 à l'aide de s3cmd

Cela devrait résoudre mon problème, mais pour une raison quelconque, il ne cesse de répéter que le fichier n'existe pas, alors qu'il existe. Cette solution est également un peu datée et n’utilise pas la méthode doesObjectExist.

Résumé de toutes les méthodes pouvant être utilisées dans le service Web Amazon S3

Cela donne la syntaxe d'utilisation de cette méthode, mais je n'arrive pas à le faire fonctionner.

S'attendent-ils à ce que vous créiez une variable booléenne pour enregistrer le statut de la méthode, ou la fonction vous donne-t-elle directement une sortie/une erreur?

C'est le code que j'utilise actuellement dans mon script bash:

existBool=doesObjectExist(${BucketName}, backup_${DomainName}_${CurrentDate}.Zip)

if $existBool ; then
        echo 'No worries, the file exists.'
fi

Je l'ai testé en utilisant uniquement le nom du fichier, au lieu de donner le chemin complet. Mais étant donné que l'erreur que je reçois est une erreur de syntaxe, je l'utilise probablement mal.

J'espère que quelqu'un pourra m'aider et me dire ce que je fais mal.

!Modifier

J'ai fini par chercher un autre moyen de faire cela car utiliser doesObjectExist n'est pas le plus rapide ni le plus simple.

10
J. Swaelen

Un moyen simple consiste à utiliser aws s3 ls

exists=$(aws s3 ls $path_to_file)
if [ -z "$exists" ]; then
  echo "it does not exist"
else
  echo "it exists"
fi
5
traceformula

La dernière fois que j'ai vu des comparaisons de performances, getObjectMetadata était le moyen le plus rapide de vérifier si un objet existait. A l'aide de l'AWS cli qui serait la méthode head-object , exemple:

aws s3api head-object --bucket www.codeengine.com --key index.html

qui retourne:

{
    "AcceptRanges": "bytes",
    "ContentType": "text/html; charset=utf-8",
    "LastModified": "Sun, 08 Jan 2017 22:49:19 GMT",
    "ContentLength": 38106,
    "ContentEncoding": "gzip",
    "ETag": "\"bda80810592763dcaa8627d44c2bf8bb\"",
    "StorageClass": "REDUCED_REDUNDANCY",
    "CacheControl": "no-cache, no-store",
    "Metadata": {}
}
9
Dave Maple

Notez que "aws s3 ls" ne fonctionne pas correctement, même si la réponse a été acceptée. Il recherche par préfixe et non par une clé d'objet spécifique. J'ai découvert cela à la dure quand quelqu'un renommait un fichier en ajoutant un «1» à la fin du nom de fichier, et le contrôle d'existence retournait toujours True.

(J'ai essayé d'ajouter ceci en tant que commentaire, mais je n'ai pas encore assez de représentants.)

8
Michael Glenn

Après @DaveMaple & @MichaelGlenn, voici la condition que j'utilise:

aws s3api head-object --bucket <some_bucket> --key <some_key> || not_exist=true
if [ $not_exist ]; then
  echo "it does not exist"
else
  echo "it exists"
fi
0
ItayB