繁体   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