shell脚本 - AWS s3存储桶,查找上次添加的文件

时间:2016-12-27 12:19:01

标签: shell amazon-web-services amazon-s3

我试图使用linux shell脚本在AWS s3存储桶中获取最后添加的文件。 你能告诉我怎样才能做到这一点吗?

4 个答案:

答案 0 :(得分:1)

一种方法是使用输出s3cmdsort来获取最后添加的文件。

s3cmd ls s3://{{bucket}} | sort | tail -n 1 | awk '{print $2}'
  • sort - 按创建时间对输出进行排序
  • tail -n 1 - 返回最后一个文件
  • awk '{print $2}' - 打印文件名

答案 1 :(得分:0)

那是不可能的。 S3不是数据库或文件系统。

但是,使用S3查询,您可以请求在特定日期之后创建或修改的对象列表:

aws s3api list-objects --bucket "YOURBUCKET" --query 'Contents[?LastModified>=2016-12-27][].{Key: Key}'

如果您只想添加未修改的对象,则必须创建自定义元数据属性,并使用基于该自定义属性的对象和查询进行保存。

答案 2 :(得分:0)

aws s3 ls s3://your-bucket --recursive | sort | tail -n 1

此命令将递归检查S3存储桶的所有文件夹和子文件夹中的所有文件,并返回最近修改的文件的名称以及文件的时间戳修改。

(请注意,awscli应该先安装并用您的AWS账户信息进行配置。请参见https://docs.aws.amazon.com/codedeploy/latest/userguide/getting-started-configure-cli.html。)

答案 3 :(得分:0)

推荐,tl; dr

在编写基于简单性测试的时间时,对于执行简单的命令的最佳折衷方案是<details> <summary> TEST TEST TEST TEST TEST TEST TEST TEST TEST TEST TEST TEST TEST TEST TEST TEST TEST TEST TEST TEST TEST TEST TEST TEST TEST </summary> INTERIOR </details>(选项2)


获取最后修改的对象的三种方法

1。使用aws s3 ls --recursive

(请参见s3cmd Usage,或在installing之后使用s3cmd浏览手册页)

sudo pip install s3cmd

2。使用AWS CLI的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}' 是指GNU awk。如果需要安装它以及macOS上的任何其他GNU实用程序,请参见this


3。使用AWS CLI的awk

(带有list-objectslist-objects-v2

s3api

请注意,这两个aws s3api list-objects-v2 --bucket the-bucket | jq -r '.[] | max_by(.LastModified) | [.Key, .LastModified, .Size]|@csv' 命令都是分页的,处理分页是列表对象s3api中的fundamental improvement

如果存储桶中有1000个以上的对象(使用v2获取对象数),则您需要处理API的分页并进行多次调用以获取自返回的结果中,sort orders3cmd du "s3://ons-dap-s-logs" | awk '{print $2}',而不是“最后修改时间”。


性能比较

这里是对相同存储桶执行的上述三种方法的简单性能比较。为简单起见,存储桶中的对象少于1000个。这是查看执行时间的一面文字:

UTF-8 binary order

({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 调用的性能明显更高;但是,要处理API的分页还有额外的(脚本)复杂性。

有用的链接: 请参阅Leveraging s3 and s3api以了解aws s3apiaws s3

之间的区别