簡體   English   中英

如何在不使用boto3下載的情況下檢查本地文件是否與S3對象相同?

[英]How to check if local file is same as S3 object without downloading it with boto3?

如何檢查本地文件是否與存儲在S3中的文件相同而不下載? 避免一次又一次地下載大文件。 S3對象有電子標簽,但如果文件是按部件上傳的,並且這個問題的解決方案似乎不起作用,則難以計算。 有沒有更簡單的方法來避免不必要的下載

我只是比較上次修改時間和下載,如果它們不同。 此外,您還可以在下載之前比較尺寸。 給定一個bucketkey和本地文件fname

import boto3
import os.path

def isModified(bucket, key, fname):
  s3 = boto3.resource('s3')
  obj = s3.Object(bucket, key)
  return int(obj.last_modified.strftime('%s')) != int(os.path.getmtime(fname))

你能使用一個小的本地數據庫,例如文本文件嗎?

  • 一次下載S3對象。 不是它的ETag。
  • 計算你想要的任何簽名。
  • 將(ETag,簽名)對放入“數據庫”中。

下次,在繼續下載之前,在“數據庫”中查找ETag。 如果存在,請計算現有文件的簽名,並與ETag對應的簽名進行比較。 如果匹配,則遠程文件與您具有的相同。

可能會使用不同的分塊重新上載相同的文件,從而更改ETag。 除非這很可能,否則你可以忽略假陰性並在極少數情況下重新下載文件。

如果您不需要立即清點,則可以生成s3存儲庫存,然后將其導入數據庫以供將來使用。

計算本地文件Etag,如下所示,用於普通文件和大型多部分文件

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM