有没有办法使用 aws s3 ls cli 将 S3 存储桶名称添加到存储桶的递归列表中?
Is there a way to add the S3 bucket name to the recursive list of a bucket using aws s3 ls cli?
我更喜欢使用 aws cli 列出 S3 内容;生成一个对象详细信息文件很方便,我可以在以后进行排序、grep 和其他操作。
遗憾的是,默认情况下它不会将 S3 存储桶名称放入对象名称中。例如,如果我想列出一个名为 example 的存储桶,我输入并得到这个:
% aws s3 ls s3://example
2021-12-23 15:31:17 8572 object_name
2021-12-22 08:45:23 11 another_object_name
有没有办法让 aws cli 将存储桶名称放在每一行?然后我可以 grep 遍历覆盖多个存储桶的一个或多个文件,并查看每个对象在哪个存储桶中。
像这样:
% aws s3 ls s3://example
2021-12-23 15:31:17 8572 s3://example/object_name
2021-12-22 08:45:23 11 s3://example/another_object_name
我在 AWS cli 文档中没有看到执行此操作的选项,但也许有人知道未记录的标志或其他内容。
AWS CLI 提供了两个与 S3 交互的子命令。您正在使用高级 s3
子命令。此命令允许非常直接地访问 S3 存储桶上的最常见操作,但其功能有限并且不会公开底层 API.
的所有功能
另一个子命令是s3api
, which offers direct access to the S3 API. With s3api
you're quite flexible regarding the formatting of the output, as you can apply a JMESPath返回前的表达式。
这是一个接近您想要的输出的示例。它不是一个完美的表示(注意日期格式和对象大小对齐的差异),但应该足够接近:
$ BUCKET_NAME=example aws s3api list-objects-v2 --bucket $BUCKET_NAME \
--query 'Contents[].[LastModified, Size, join(`/`, [`s3://'$BUCKET_NAME'`, Key])]' \
--output text
2021-12-23T15:31:17.000Z 8572 s3://example/object_name
2021-12-22T08:45:23.000Z 11 s3://example/another_object_name
需要注意的是 list-objects-v2
不会自动处理分页,因此如果您在 S3 存储桶中有很多对象,您必须将其包装在一个循环中自己进行分页。
我决定在 shell 中执行此操作最简单。
这意味着我使用了这个:
aws s3 ls | sed s/....................//|sed 's#.*#BN=&; aws s3 ls s3://& --recursive | sed "s, , ,g;s, , ,g;s, , ,g;s, , ,g"|sed "s, , s3://$BN/,3"#' | sh -x > filename
我更喜欢使用 aws cli 列出 S3 内容;生成一个对象详细信息文件很方便,我可以在以后进行排序、grep 和其他操作。
遗憾的是,默认情况下它不会将 S3 存储桶名称放入对象名称中。例如,如果我想列出一个名为 example 的存储桶,我输入并得到这个:
% aws s3 ls s3://example
2021-12-23 15:31:17 8572 object_name
2021-12-22 08:45:23 11 another_object_name
有没有办法让 aws cli 将存储桶名称放在每一行?然后我可以 grep 遍历覆盖多个存储桶的一个或多个文件,并查看每个对象在哪个存储桶中。
像这样:
% aws s3 ls s3://example
2021-12-23 15:31:17 8572 s3://example/object_name
2021-12-22 08:45:23 11 s3://example/another_object_name
我在 AWS cli 文档中没有看到执行此操作的选项,但也许有人知道未记录的标志或其他内容。
AWS CLI 提供了两个与 S3 交互的子命令。您正在使用高级 s3
子命令。此命令允许非常直接地访问 S3 存储桶上的最常见操作,但其功能有限并且不会公开底层 API.
另一个子命令是s3api
, which offers direct access to the S3 API. With s3api
you're quite flexible regarding the formatting of the output, as you can apply a JMESPath返回前的表达式。
这是一个接近您想要的输出的示例。它不是一个完美的表示(注意日期格式和对象大小对齐的差异),但应该足够接近:
$ BUCKET_NAME=example aws s3api list-objects-v2 --bucket $BUCKET_NAME \
--query 'Contents[].[LastModified, Size, join(`/`, [`s3://'$BUCKET_NAME'`, Key])]' \
--output text
2021-12-23T15:31:17.000Z 8572 s3://example/object_name
2021-12-22T08:45:23.000Z 11 s3://example/another_object_name
需要注意的是 list-objects-v2
不会自动处理分页,因此如果您在 S3 存储桶中有很多对象,您必须将其包装在一个循环中自己进行分页。
我决定在 shell 中执行此操作最简单。
这意味着我使用了这个:
aws s3 ls | sed s/....................//|sed 's#.*#BN=&; aws s3 ls s3://& --recursive | sed "s, , ,g;s, , ,g;s, , ,g;s, , ,g"|sed "s, , s3://$BN/,3"#' | sh -x > filename