AWS CLI S3只对指定文件进行同步



我需要同步两个AWS S3桶,但我只需要同步列表中的文件。下面是这个场景:

BucketA:

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

BucketB:

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中包含在--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="*"——include ="FILEPATH"

    • 此解决方案将适用于一个或两个文件
    • 如果你想同步更多的文件,它会比简单地同步所有文件持续的时间更长
    • 它将花费更长的时间的原因是,'sync'命令将递归地遍历目标目录
  2. 的所有文件。
  3. 对于用——include传递的每个参数,将有一次迭代。
  4. sync将检查通过——include传递的模式是否匹配文件路径
  5. 你也可以通过——include
  6. 传递通配符而不是路径
  7. 通过使用——debug选项,你可以自己验证这个
  8. 你可以使用'cp'命令代替'sync'命令,并将你的文件路径附加到目标目录的路径

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

因此,对于至少几个文件,您可以使用这些变通方法,但如果有几百个文件,就像我的情况一样,就没有办法了。

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

最新更新