How to check if local file is same as S3 object without downloading it with boto3?
如何在不下载的情况下检查本地文件是否与存储在S3中的文件相同?避免一次又一次地下载大文件。 S3 对象具有电子标签,但如果文件是分段上传的,并且此问题的解决方案似乎不起作用,则它们很难计算。有没有一些更简单的方法可以避免不必要的下载?
- 为什么不只比较上次修改时间?
如果它们不同,我会比较最后修改时间并下载。此外,您还可以在下载前比较大小。给定一个 bucket、key 和一个本地文件 fname:
1
2 3 4 5 6 7 |
import boto3
import os.path def isModified(bucket, key, fname): |
- 同意。文件名大小修改时间通常就足够了。如果您需要 100% 确定事情没有改变,请使用 ETag。
- 有没有办法在保留修改日期的同时从 S3 下载文件?否则,使用它永远不会起作用,因为每次下载文件时,本地副本都会有一个新的创建
你能用一个小的本地数据库吗?一个文本文件?
- 一次下载一个 S3 对象。不是它的ETag。
- 计算你想要的任何签名。
- 将(ETag,签名)对放入”数据库”。
下次,在继续下载之前,请在”数据库”中查找 ETag。如果存在,请计算现有文件的签名,并与对应于 ETag 的签名进行比较。如果它们匹配,则远程文件与您拥有的相同。
同一文件可能会以不同的分块方式重新上传,从而更改 ETag。除非这很有可能,否则您可以忽略误报并在这种极少数情况下重新下载文件。
- “数据库”很可能是一个 S3 对象标签。这样您就不需要额外的资源,并且如果对象路径/密钥发生更改,您也不必重新计算签名。
- 我想它会起作用,或者我可以计算签名并将其作为元数据附加到 S3 对象。似乎这是非常标准的操作,应该有一些方法可以在不编写自己的解决方案的情况下做到这一点。我也想知道 aws s3 sync 控制台命令是如何工作的。
- 您还可以使用 What is the algorithm 来计算大于 5GB 的文件的 Amazon-S3 Etag?自己计算 Etag,但将其存储在数据库中可以避免重复计算。
如果您不需要即时库存,您可以生成 s3 存储库存,然后将它们导入您的数据库以备将来使用。
为普通文件和大型多部分文件计算本地文件 Etag,如下所示。
来源:https://www.codenong.com/44532078/