簡體   English   中英

AWS CLI S3API 在路徑中查找最新文件夾

[英]AWS CLI S3API find newest folder in path

我有一個非常大的存儲桶(數十萬個對象)。 我有一條路徑(可以說 s3://myBucket/path1/path2)。 /path2 獲取也是文件夾的上傳。 因此,示例可能如下所示:

s3://myBucket/path1/path2/v6.1.0
s3://myBucket/path1/path2/v6.1.1
s3://myBucket/path1/path2/v6.1.102
s3://myBucket/path1/path2/v6.1.2
s3://myBucket/path1/path2/v6.1.25
s3://myBucket/path1/path2/v6.1.99

S3 不考慮版本號排序(這是有道理的),但按字母順序排列的列表中的最后一個不是最后一個上傳的。 在那個例子中 .../v6.1.102 是最新的。

這是我到目前為止所得到的:

aws s3api list-objects 
--bucket myBucket
--query "sort_by(Contents[?contains(Key, \`path1/path2\`)],&LastModified)"´ 
--max-items 20000

所以這里的一個問題是 max-items 似乎從存儲桶中的所有文件遞歸地按字母順序開始。 20000 確實訪問了我的文件,但處理這么多文件是一個非常緩慢的過程。

所以我的問題是雙重的:

1 - 這仍在搜索整個存儲桶,但我只想將其縮小到 path2/ 。 我可以這樣做嗎?

2 - 這僅列出對象,是否可以僅拉出路徑列表?

基本上最終目標是我只想要一個命令來返回上面示例中的最新文件夾名稱,如“v6.1.102”。

要回答 #1,您可以添加--prefix path1/path2來限制您在存儲桶中查詢的內容。

在按最后修改排序方面,我只能想到使用SDK將list_objects_v2head_object (boto3)結合起來,以獲取對象的最后修改並以編程方式排序

更新

或者,您可以在jmespath 中通過LastModified反向排序並返回第一個項目,為您提供最新的對象並從那里收集目錄。

aws s3api list-objects-v2 \
--bucket myBucket \
--prefix path1/path2 \
--query 'reverse(sort_by(Contents,&LastModified))[0]'

如果您想進行通用查詢,例如“最低版本”、“最高版本”、“所有 v6.x 版本”,那么請考慮使用版本號維護一個單獨的數據庫。

如果您只需要知道最高版本號並且需要快速檢索它(比列表對象調用更快),那么您可以獨立維護該版本號。 例如,您可以使用 Lambda 函數響應上傳到 path1/path2 的對象,其中 Lambda 函數負責將它看到的最高版本號存儲到位於 s3://mybucket/version.max 的文件中。

Prefix 使用 boto3 客戶端與 list_object 一起使用。 但是使用 boto3 資源可能會出現一些問題。 分頁中的分頁器是一個很棒的概念並且效果很好! 查找最新更改(添加對象):sort_by(contents)[-1]

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM