Today is possible to search the bucket using JMESPath, the same way we can do in AWS CLI (example).
import boto3
s3 = boto3.client("s3")
s3_paginator = s3.get_paginator('list_objects_v2')
s3_iterator = s3_paginator.paginate(Bucket='your-bucket-name')
filtered_iterator = s3_iterator.search(
"Contents[?starts_with(Key, 'folder6/')]"
" | reverse(sort_by(@, &to_string(LastModified)))"
" | @[].Key"
" | [:2]"
)
for key_data in filtered_iterator:
print(key_data)
JMESPath explanation
Contents[?starts_with(Key, 'folder6/')]
: optional, selects objects inside a particular folder.
reverse(sort_by(@, &to_string(LastModified)))
: sorts the objects by the "LastModified" date value, in a decreasing order.
@[].Key
: gets the objects names.
[:2]
: gets the first 2.
For example, if the bucket data looks like this:
{
"Contents": [
{"Key": "folder6/file-64.pdf", "LastModified": "2014-11-21T19:04:05.000Z", "ETag": "\"70ee1738b6b21e2c8a43f3a5ab0eee64\"", "Size": 187932, "StorageClass": "STANDARD"},
{"Key": "folder5/file-63.pdf", "LastModified": "2014-11-21T19:03:05.000Z", "ETag": "\"70ee1738b6b21e2c8a43f3a5ab0eee63\"", "Size": 227543, "StorageClass": "STANDARD"},
{"Key": "folder6/file-62.pdf", "LastModified": "2014-11-21T19:02:05.000Z", "ETag": "\"70ee1738b6b21e2c8a43f3a5ab0eee62\"", "Size": 173484, "StorageClass": "STANDARD"},
{"Key": "folder6/file-61.pdf", "LastModified": "2014-11-21T19:01:05.000Z", "ETag": "\"70ee1738b6b21e2c8a43f3a5ab0eee61\"", "Size": 192940, "StorageClass": "STANDARD"}
]
}
It will yield this result::
[
"folder6/file-64.pdf",
"folder6/file-62.pdf"
]