boto3 は download_file() や upload_file() を提供しているが、これらを実行するたびに同じファイルであってもコピーされる。
AWSCLI のs3 sync
コマンドみたいに、差分がある場合だけコピーし、無駄なコピーを避けたいです。
以下の例は、list_objects_v2() で取得した S3 のファイル情報(ファイルサイズとタイムスタンプ)とローカルのファイル情報を比較して、異なっている場合のみファイルをアップロード・ダウンロードする。
まずは、ローカルと S3 のファイル情報を取得。
そして、コピー対象となるファイルリストを取得。アップロードの場合はほぼ同じなので省略。
対象となるファイルリストを取得したら、download_file() と upload_file() を使ってダウンロード・アップロードを行えばいい。
注意すべきなのは、コピー済みのファイルに対して、S3 の更新時間に基づいてos.utime()
でローカルファイルの更新時間を S3 での更新時間と一致させる必要がある。