检查S3存储桶中是否存在文件

检查S3存储桶中是否存在文件

该目录/data/files/有数千个文件,例如:

1test
2test
3test

[...]

60000test
60001test

我还使用AWS CLI.但是,有时 S3 存储桶可能会脱机,因此文件会被跳过。

如何检查 中存在的文件是否/data/files/也在 S3 存储桶中?如果不将丢失的文件复制到 S3?

我更愿意使用 BASH 来完成此操作。另外,如果我需要将 AWS CLI 更改为另一个,也可以。

答案1

如果您aws s3 ls对实际文件名执行此操作。如果文件名存在,则退出代码将为 0 并显示文件名,否则退出代码将不为 0:

aws s3 ls s3://bucket/filname
if [[ $? -ne 0 ]]; then
  echo "File does not exist"
fi

答案2

第一个答案很接近,但如果您在 shebang 中使用 -e ,脚本将失败,这是您最不希望看到的。最好使用字数统计。所以你可以使用下面的命令:

wordcount=`aws s3 ls s3://${S3_BUCKET_NAME}/${folder}/|grep $${file}|wc -c`
echo wordcount=${wordcount}
if [[ "${wordcount}" -eq 0 ]]; then
do something
else
do something
fi

答案3

尝试以下操作:

aws s3api head-object --bucket ${S3_BUCKET} --key ${S3_KEY}

它检索元数据无需检索对象本身即可获取对象的信息。读取(s3:获取对象)需要访问权限。 。

答案4

我创建了两个函数作为示例,因为我想我可能想知道文件的大小,并且我可能想知道文件是否存在。

此函数获取文件的大小并将其作为回显“返回”:

s3_file_size() {
    if command -v aws &> /dev/null; then
        echo "$(aws s3 ls "${1}" --summarize | grep "Total.*Size" | grep -o -E '[0-9]+')"
        return 0
    else
        echo "Warn-${FUNCNAME[0]}, AWS command missing."
        return 1
    fi
}

该函数使用另一个函数来确定它是否收到文件大小为 0 的文件,这意味着该文件本质上不存在。 (是的,它会将大小为 0 的文件视为不存在)

s3_does_file_exist() {
    if command -v aws &> /dev/null; then
        [[ $(s3_file_size "${1}") -lt 1 ]] && return 1 || return 0
    else
        echo "Warn-${FUNCNAME[0]}, AWS command missing."
        return 1
    fi
}

相关内容