S3存储桶是否有关于上次更新时间的信息?如何查找存储桶中任何对象的最后时间?
答案 0 :(得分:6)
存储桶last modified time
有无原生支持。我这样做的方法是使用aws cli
,对输出进行排序,获取底线并打印前两个字段。
$ aws s3 ls mybucket --recursive | sort | tail -n 1 | cut -d ' ' -f1,2
2016-03-18 22:46:48
答案 1 :(得分:1)
在编写基于简单性测试的时间时,对于执行简单的命令的最佳折衷方案是aws s3 ls --recursive
(选项2)
s3cmd
(请参见s3cmd Usage,或在installing之后使用sudo pip install s3cmd
浏览手册页)
s3cmd ls s3://the-bucket | sort| tail -n 1
s3
aws s3 ls the-bucket --recursive --output text | sort | tail -n 1 | awk '{print $1"T"$2","$3","$4}'
(请注意,上面的awk
是指GNU awk。如果需要安装它以及macOS上的任何其他GNU实用程序,请参见this)
s3api
(带有list-objects
或list-objects-v2
)
aws s3api list-objects-v2 --bucket the-bucket | jq -r '.[] | max_by(.LastModified) | [.Key, .LastModified, .Size]|@csv'
请注意,这两个s3api
命令都是分页的,处理分页是列表对象v2
中的fundamental improvement。
如果存储桶中有1000个以上的对象(使用s3cmd du "s3://ons-dap-s-logs" | awk '{print $2}'
获取对象数),则您需要处理API的分页并进行多次调用以获取自返回的结果中,sort order是UTF-8 binary order
,而不是“最后修改时间”。
这里是对相同存储桶执行的上述三种方法的简单性能比较。为简单起见,存储桶中的对象少于1000个。这是查看执行时间的一面文字:
export bucket_name="the-bucket" && \
( \
time ( s3cmd ls --recursive "s3://${bucket_name}" | awk '{print $1"T"$2","$3","$4}' | sort | tail -n 1 ) & ; \
time ( aws s3 ls --recursive "${bucket_name}" --output text | awk '{print $1"T"$2","$3","$4}' | sort | tail -n 1 ) & ; \
time ( aws s3api list-objects-v2 --bucket "${bucket_name}" | jq -r '.[] | max_by(.LastModified) | [.LastModified, .Size, .Key]|@csv' ) & ; \
time ( aws s3api list-objects --bucket "${bucket_name}" | jq -r '.[] | max_by(.LastModified) | [.LastModified, .Size, .Key]|@csv' ) &
) >! output.log
({output.log
将存储每个命令列出的最后修改的对象)
上面的输出如下:
( s3cmd ls --recursive ...) 1.10s user 0.10s system 79% cpu 1.512 total
( aws s3 ls --recursive ...) 0.72s user 0.12s system 74% cpu 1.128 total
( aws s3api list-objects-v2 ...) 0.54s user 0.11s system 74% cpu 0.867 total
( aws s3api list-objects ...) 0.57s user 0.11s system 75% cpu 0.900 total
对于相同数量的返回对象,aws s3api
调用的性能明显更高;但是,要处理API的分页还有额外的(脚本)复杂性。
有用的链接:
请参阅Leveraging s3 and s3api以了解aws s3
和aws s3api
答案 2 :(得分:0)
正如其他人所评论的那样,没有元数据可以存储此信息。您只需要遍历对象即可。
使用boto3
执行此操作的代码:
import boto3
from datetime import datetime
def bucket_last_modified(bucket_name: str) -> datetime:
"""
Given an S3 bucket, returns the last time that any of its objects was
modified, as a timezone-aware datetime.
"""
s3 = boto3.resource('s3')
bucket = s3.Bucket(bucket_name)
objects = list(bucket.objects.all())
return max(obj.last_modified for obj in objects)
答案 3 :(得分:-1)
关于GET BUCKET对象版本的Amazon S3 API规范(可在:http://docs.aws.amazon.com/AmazonS3/latest/API/RESTBucketGETVersion.html获得)表示返回了LastModified属性 - 但我不确定它是否会针对每个对象更新更新...