我试图使用linux shell脚本在AWS s3存储桶中获取最后添加的文件。 你能告诉我怎样才能做到这一点吗?
答案 0 :(得分:1)
一种方法是使用输出s3cmd和sort
来获取最后添加的文件。
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)
在编写基于简单性测试的时间时,对于执行简单的命令的最佳折衷方案是<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)
aws s3 ls --recursive
(请参见s3cmd Usage,或在installing之后使用s3cmd
浏览手册页)
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}'
是指GNU awk。如果需要安装它以及macOS上的任何其他GNU实用程序,请参见this)
awk
(带有list-objects
或list-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 order是s3cmd 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 s3api
和aws s3