簡體   English   中英

AWS CLI S3 僅在選定文件上同步?

[英]AWS CLI S3 sync only over selected files?

我需要同步兩個 AWS S3 存儲桶,但我只需要同步列表中的文件。 這是場景:

桶A:

File1.jpg Deleted  
File2.jpg Modified
File3.jpg Deleted
File4.jpg Modified
File5.jpg Modified
File6.jpg New

桶B:

File1.jpg 
File2.jpg 
File3.jpg 
File4.jpg 
File5.jpg 

我正在尋找這樣的命令:

aws s3 sync s3://BucketA s3://BucketB --delete --exclude "*" --include "File1.jpg;File2.jpg;File4.jpg"

結果 BucketB 必須是這樣的:

File1.jpg deleted
File2.jpg Modified
File3.jpg No changed
File4.jpg Modified
File5.jpg No changed

任何的想法?

看起來這是可以實現的,除了刪除部分。

此命令將僅sync指定的文件:

aws s3 sync s3://bucketA s3://bucketB --exclude "*" --include "File1.jpg" --include "File2.jpg" --include "File4.jpg"

但是,-- --delete參數似乎只查看BucketA參數中包含的BucketA中的--include ,導致所有其他文件“不可見”,因此從 BucketB 中刪除。

這個命令:

aws s3 sync s3://bucketA s3://bucketB --delete --exclude "*" --include "File1.jpg" --include "File2.jpg" --include "File4.jpg"

實際上刪除除File2.jpgFile4.jpg之外的所有文件。 因此,您似乎無法以預期的方式進行選擇性刪除。

這是一個測試上述所有內容的腳本:

aws s3 cp foo s3://bucketa/File1.jpg
aws s3 cp foo s3://bucketa/File2.jpg
aws s3 cp foo s3://bucketa/File3.jpg
aws s3 cp foo s3://bucketa/File4.jpg
aws s3 cp foo s3://bucketa/File5.jpg
aws s3 sync s3://bucketa s3://bucketb
aws s3 rm s3://bucketa/File1.jpg
aws s3 rm s3://bucketa/File3.jpg
aws s3 cp foo s3://bucketa/File6.jpg
aws s3 cp bar s3://bucketa/File2.jpg
aws s3 cp bar s3://bucketa/File4.jpg
aws s3 cp bar s3://bucketa/File5.jpg

aws s3 ls s3://bucketa
2015-07-23 08:50:44         49 File2.jpg
2015-07-23 08:50:49         49 File4.jpg
2015-07-23 08:50:53         49 File5.jpg
2015-07-23 08:50:20         24 File6.jpg

aws s3 ls s3://bucketb
2015-07-23 08:49:35         24 File1.jpg
2015-07-23 08:49:35         24 File2.jpg
2015-07-23 08:49:36         24 File3.jpg
2015-07-23 08:49:36         24 File4.jpg
2015-07-23 08:49:36         24 File5.jpg 

aws s3 sync s3://bucketa s3://bucketb --exclude "*" --include "File1.jpg" --include "File2.jpg" --include "File4.jpg"

無法同步特定文件,但實際上有一些不好的解決方法。

  1. 正如@John Rotenstein 提到的,你可以使用 --exclude="*" --indclude="FILEPATH"

    • 此解決方案適用於一兩個文件
    • 如果您想同步更多文件,它會比簡單地同步所有文件持續更長時間
    • 需要更長的時間的原因是“同步”命令將遞歸迭代目標目錄的所有文件
    • 對於使用 --include 傳遞的每個參數,將有一個迭代整體文件
    • sync 將檢查通過 --include 傳遞的模式是否與文件路徑匹配
    • 您還可以通過 --include 傳遞通配符而不是路徑
    • 通過使用 --debug 選項,您可以自己驗證
  2. 您可以使用 'cp' 命令代替 'sync' 並將文件路徑附加到目標目錄的路徑

    • 此方法不檢查是否需要同步,它只會復制文件
    • 對於每個文件路徑執行整個復制命令,非常耗時

因此,對於至少幾個文件,您可以使用這些解決方法,但是如果像我這樣有數百個文件,則沒有辦法。

如果你想推這個,我已經在github上開了一張票: https : //github.com/aws/aws-cli/issues/5167

暫無
暫無

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

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