2017-07-26 167 views
0

我有幾個問題試圖列出s3存儲桶中目錄中的匹配文件。有沒有辦法使用ls和通配符從s3存儲桶中提取文件? (aws cli)

我一直在使用LS創建我的特定目錄中的所有文件(包括時間戳和文件大小)通過添加這一個新的文件,例如aws s3 --profile mybucket1 ls s3://my-bucket1/directory1/directory2/ >> list.txt的列表。

這是既快速又按預期工作。但是,我還在directory1中列出了一些我想要列出的文件,但只有某些文件與其周圍的通配符匹配。

最接近實現這個的是使用cp(帶--exclude和--include)而不是ls,因爲ls不允許使用--exclude或--include選項,例如aws s3 --profile mybucket1 cp s3://my-bucket1/directory1/ /path/to/local/directory/ --exclude "*" --include "*match-me*" --recursive,但它永遠需要跨越一個單一的文件(我沒有得到任何標準輸出,因爲我相信它會在複製任何內容之前掃描整個目錄尋找匹配的字符串)。我也無法刪除 - 遞歸,因爲它沒有它就給我一個錯誤,儘管我只想在directory1中複製文件。

我的選擇是使用ls,因爲它更快,我不必在下載的文件上做另一個ls來生成與我列出的和從directory2附加的文件相同的格式。

此外,我在一個bash腳本中運行所有這些命令,以防有什麼區別。

我希望這是有道理的,如果有人有任何可能的解決方案,這將是非常感激。

+0

查看「aws s3同步幫助」 – NauT

+2

如果人們有興趣爲這些類型的問題創建場所,請遵循關於[在StackExchange上專用的雲計算站點]的建議(https://area51.stackexchange.com/提案/ 110490/cloud-computing-aws-azure-google-openstack-etc?referrer = Gtut7wQSWPk88jFJz_zqMg2),並提出一些示例問題。 –

回答

1

你應該看看aws s3api list-objects

  1. 如果你的模式是在關鍵的起點和要對陣match-me*,您可以使用--prefix參數:

    aws s3api list-objects --bucket <bucket> --prefix "match-me" 
    

    將返回所有以開頭的密鑰匹配我

  2. 如果你的模式是在關鍵的名字的中間,你要匹配*match-me*,你可以對運行結果的查詢:

    aws s3api list-objects --bucket test-bucket-fh --query "Contents[?contains(Key, 'match-me')]" 
    
+0

也注意到列表對象最多隻能返回1000個對象。 – LHWizard

+0

@LHWizard正確,如果你的桶中有超過1000個物體,這需要分頁 –

+0

@FrédéricHenri我運行了這個命令,但它需要很長時間才能輸出。我假設這是因爲它正在用查詢掃描整個存儲桶。我會看看需要多長時間才能運行,但我更喜歡類似於我在問題中寫的內容,因爲這是一個非常快速的過程,因爲它不通過整個桶。 – fep92

0

如果你需要列出亞馬遜S3的內容是不急(例如,做每天一次),那麼你可以使用Amazon S3 Storage Inventory

亞馬遜S3庫存每天提供一個逗號分隔值(CSV)你的對象的平面文件輸出和一個其相應的元數據或每週對於S3存儲桶或共享前綴(即,名稱以公共字符串開頭的對象)爲基礎的

它在Amazon S3中提供每日/每週文件,其中包含所有對象的列表。附加charges適用。

相關問題