`aws s3 sync`如何确定文件是否已更新?

时间:2017-04-20 21:07:31

标签: node.js amazon-web-services amazon-s3

当我在终端中背靠背运行命令时,它不会第二次同步。哪个好极了!它不应该。但是,如果我运行我的构建过程并以编程方式运行aws s3 sync,那么它会同时同步所有文件,就像我的构建过程第二次改变某些东西一样。

无法弄清楚可能发生的事情。有什么想法吗?

我的构建过程基本上是pug source/ --out static-site/stylus -c styles/ --out static-site/styles/

3 个答案:

答案 0 :(得分:4)

根据这个 - http://docs.aws.amazon.com/cli/latest/reference/s3/sync.html

S3 sync会比较文件的大小和上次修改的时间戳,以查看是否需要同步文件。

在您的情况下,我怀疑构建系统是否会导致更新的时间戳,即使文件大小没有改变?

答案 1 :(得分:3)

AWS CLI sync

  

如果本地文件的大小为,则需要上传本地文件   与s3对象的大小不同,最后修改时间为   本地文件比s3对象的上次修改时间新,   或本地文件在指定存储桶下不存在,并且   前缀。

     

-size-only(布尔值)使每个键的大小成为用于决定是否从源同步到目标的唯一标准。

您需要--size-only选项,该选项仅查看文件大小而不是最后修改日期。这对于资产构建系统是完美的,该资产构建系统会经常更改上次修改日期,但不会更改文件的实际内容(我正在使用webpack构建来更改它,即使文件内容相同,字体仍会保持同步)。如果您不使用将内容的哈希值合并到文件名中的构建方法,则可能会遇到问题(如果构建发出相同大小的文件,但包含不同的内容),请当心。

我确实手动测试了添加不在远程存储桶中的新文件,并且确实使用--size-only将其添加到了远程存储桶中。

答案 2 :(得分:3)

这篇文章有些过时了,不过我仍然会为通过Google到达这里的人们做出贡献。

我同意选择的答案。为了添加其他上下文,AWS S3功能在许多方面与标准linux s3不同。在Linux中,可以计算md5hash以确定文件是否已更改。 S3不会执行此操作,因此它只能根据大小和/或时间戳确定。更糟糕的是,AWS在传输任何一种方式时都不会保留时间戳,因此在同步到本地时将忽略时间戳,仅在同步到s3时使用。