有没有办法使用 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