shell脚本-AWS S3存储桶,查找最后添加的文件



我正在尝试使用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-objectslist-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 s3aws 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。)

最新更新