如何按特定文件大小获取查询 s3 存储桶

How to get query s3 bucket by specific file size

目前上传的一些文件已损坏。它们的文件大小为 0 字节。请问如何查询我的 s3 存储桶并按特定大小过滤,我正在尝试查询字节为 0 时?

目前我有两个问题。

第一个递归列出存储桶中的所有文件,但没有排序。

aws s3 ls s3://testbucketname --recursive --summarize --human-readable

第二种排序,但仅当提供前缀时,在我的例子中,前缀是文件夹名称。我目前的bucket结构如下{accountId}/{filename}

aws s3api list-objects-v2 --max-items 10 --bucket testbucketname --prefix "30265"  --query "sort_by(Contents,&Size)"

30265 是 accountId/folder 名称。如果未提供前缀,排序将无法正常工作。

如有任何帮助,我们将不胜感激。

此查询非常适合过滤字符串形式的名称

aws s3api list-objects --bucket testbucketname --query "Contents[?contains(Key, '.jpg')]"

不幸的是,我无法使用 contains 作为 Size,而且没有等号。

您可以使用 --query 逻辑将列表对象本地过滤为仅 zero-byte 大的对象:

aws s3api list-objects-v2 --bucket example-bucket --query 'Contents[?Size==`0`]'

或者,如果您只想查看没有其他键的列表 meta-data,您可以进一步过滤列表:

aws s3api list-objects-v2 --bucket example-bucket --query 'Contents[?Size==`0`].Key'

(对于这两个,当 Windows 上的 运行 时,将外部 ' 替换为 "。)

此外,如果目标是删除这些对象,您可以使用 jq 和子 shell 构造一个删除目标对象的查询:

aws s3api delete-objects --bucket example-bucket --delete \
"$(aws s3api list-objects-v2 --bucket example-bucket --query 'Contents[?Size==`0`].Key' |\
 jq '{"Objects": map({"Key":.})}')"

没有直接的方法可以用 Windows 的命令解释器来完成同样的构造。