该目录/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
}