【问题标题】:AWS CLI S3 sync only over selected files?AWS CLI S3 仅在选定文件上同步?
【发布时间】:2015-10-10 18:00:48
【问题描述】:

我需要同步两个 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

有什么想法吗?

【问题讨论】:

    标签: amazon-web-services amazon-s3 sync aws-cli


    【解决方案1】:

    看起来这是可以实现的,除了删除部分。

    此命令将sync 仅指定文件:

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

    但是,--delete 参数似乎只查看 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"
    

    【讨论】:

    • 非常感谢约翰。我将尝试在单独的命令中进行删除。
    • 可能是 AWS 架构师应该考虑改进 --include 参数以更紧凑的形式执行此类过程。我认为将同步过程仅应用于列表中的文件而不处理不在此列表中的文件并不难。
    • 我已经在一个真实案例中测试过这个解决方案,它是不可行的。带有 50 --include 的 AWS CLI 命令会冻结控制台。
    • 我们是否需要 exclude 就好像我们已经有 include 特定文件一样? --exclude "*" --include "File1.jpg" --include "File2.jpg" --include "File4.jpg"
    • @AlwaysSunny 试试看,让我们知道!
    【解决方案2】:

    没有办法同步特定文件,但确实有一些不好的解决方法。

    1. 正如@John Rotenstein 所说,您可以使用 --exclude="*" --indclude="FILEPATH"

      • 此解决方案适用于一两个文件
      • 如果您想同步更多文件,它会比简单地同步所有文件持续时间更长
      • 需要更长时间的原因是,“同步”命令将递归迭代目标目录的所有文件
      • 对于通过 --include 传递的每个参数,将有一个迭代整体文件
      • sync 将检查通过 --include 传递的模式是否与文件路径匹配
      • 您还可以通过 --include 传递通配符而不是路径
      • 通过使用 --debug 选项,您可以自己验证这一点
    2. 您可以使用 'cp' 命令而不是 'sync' 并将文件路径附加到目标目录的路径

      • 此方法不检查是否需要同步,它只会复制文件
      • 对每个文件路径执行整个复制命令,非常耗时

    因此,对于至少几个文件,您可以使用这些解决方法,但如果像我这样有数百个文件,则没有办法。

    如果你想推这个,我已经在github开票了: https://github.com/aws/aws-cli/issues/5167

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-05-11
      • 2020-02-14
      • 2019-08-31
      • 2019-06-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-05-01
      相关资源
      最近更新 更多