我正在尝试使用linux shell脚本在AWS S3存储桶中获取最后一个添加的文件。你能让我知道我怎么能做这份工作吗?
一种方法是使用S3CMD和sort
的输出来获取最后一个添加的文件。
s3cmd ls s3://{{bucket}} | sort | tail -n 1 | awk '{print $2}'
-
sort
-通过创建时间对输出进行分类 -
tail -n 1
-返回最后一个文件 -
awk '{print $2}'
-打印文件名
建议,tl; dr
基于简单性能测试的撰写本文时,表现出的简单命令的最佳折衷是aws s3 ls --recursive
(选项#2)
3种获取最后修改对象的方法
1。使用s3cmd
(请参阅S3CMD使用情况,或在使用sudo pip install s3cmd
安装后探索MAN页面)
s3cmd ls s3://the-bucket | sort| tail -n 1
2。使用AWS CLI的s3
aws s3 ls the-bucket --recursive --output text | sort | tail -n 1 | awk '{print $1"T"$2","$3","$4}'
(请注意,上述awk
是指GNU AWK。
3。使用AWS CLI的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
的基本改进。
如果存储桶具有超过1000个对象(使用s3cmd du "s3://ons-dap-s-logs" | awk '{print $2}'
获取对象的数量),则您需要处理API的分页并进行多个调用以获取所有结果,因为返回的结果是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的分页。
有用的链接:请参阅利用S3和S3API了解aws s3
和aws s3api
这是不可能的。S3不是数据库或文件系统。
但是,使用S3查询,您可以请求一定日期后创建或修改的对象列表:
aws s3api list-objects --bucket "YOURBUCKET" --query 'Contents[?LastModified>=2016-12-27][].{Key: Key}'
,如果您只需要添加的对象(未修改),则必须创建自定义元数据属性,将其保存在对象并基于该自定义属性的情况下。
aws s3 ls s3://your-bucket --recursive | sort | tail -n 1
此命令将递归检查S3存储桶的所有文件夹和子文件夹中的所有文件,并返回文件的 name 最近修改的文件以及 timestamp 修改。
(注意,awscli
应首先安装并使用您的AWS帐户信息配置。请参阅https://docs.aws.amazon.com/codedeploy/latest/userguide/getting-started-configure-cli.html。)