我想知道是否可以检查某个存储桶中是否存在某些文件.
这就是我发现的:
使用s3cmd检查文件是否在S3存储桶中
它应该解决我的问题,但由于某种原因它不断返回该文件不存在,而它确实存在.这个解决方案也有点过时,不使用该
doesObjectExist
方法.
可以在Amazon S3 Web服务中使用的所有方法的摘要
这给出了如何使用此方法的语法,但我似乎无法使其工作.
他们是否希望您创建一个布尔变量来保存方法的状态,或者该函数是否直接为您提供输出/抛出错误?
这是我目前在我的bash脚本中使用的代码:
existBool=doesObjectExist(${BucketName}, backup_${DomainName}_${CurrentDate}.zip) if $existBool ; then echo 'No worries, the file exists.' fi
我只使用文件名来测试它,而不是给出完整路径.但由于我得到的错误是语法错误,我可能只是错误地使用它.
希望有人可以帮助我,告诉我我做错了什么.
!编辑
我最终寻找另一种方法来做到这一点,因为使用doesObjectExist
不是最快或最简单的.
上次我看到性能比较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.
(试图将其添加为评论,但还没有足够的代表.)
一种简单的方法是使用 aws s3 ls
exists=$(aws s3 ls $path_to_file) if [ -z "$exists" ]; then echo "it does not exist" else echo "it exists" fi
继@DaveMaple和@MichaelGlenn答案之后,这是我使用的条件:
aws s3api head-object --bucket--key || not_exist=true if [ $not_exist ]; then echo "it does not exist" else echo "it exists" fi