AWS S3: как проверить, существует ли файл в ведре с помощью bash

Я хотел бы знать, можно ли проверить, есть ли определенные файлы в определенном ведре.

вот что я нашел:

проверка, если файл находится в ведре S3 с помощью s3cmd

это должно исправить мою проблему, но по какой-то причине он продолжает возвращаться, что файл не существует, хотя это так. Это решение также немного устарело и не использует doesObjectExist метод.

резюме всех методы, которые можно использовать в веб-службе Amazon S3

Это дает синтаксис того, как использовать этот метод, но я не могу заставить его работать.

они ожидают, что вы сделаете логическую переменную для сохранения статуса метода,или функция непосредственно дает вам вывод / бросок ошибки?

Это код, который я сейчас использую в своем скрипте bash:

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

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

Я проверил его, используя только имя из файла, вместо того, чтобы давать полный путь. Но поскольку ошибка, которую я получаю, является синтаксической ошибкой, я, вероятно, просто использую ее неправильно.

надеюсь, кто-то может помочь мне и скажите мне, что я делаю неправильно.

!Edit

Я закончил тем, что искал другой способ сделать это с помощью doesObjectExist Не самый быстрый и простой.

3 ответов


один простой способ-использовать aws s3 ls

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

в последний раз я видел сравнение производительности getObjectMetadata самый быстрый способ проверить, если объект существует. Используя AWS cli, это будет head-object метод, пример:

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

возвращает:

{
    "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": {}
}

обратите внимание, что" aws s3 ls " не совсем работает, хотя ответ был принят. Он выполняет поиск по префиксу, а не по определенному ключу объекта. Я обнаружил это сложным способом, когда кто-то переименовал файл, добавив " 1 " в конец имени файла, и проверка существования все равно вернет True.

(попытался добавить это в качестве комментария,но пока недостаточно.)