如何用gsutil rsync仅复制Google Cloud存储桶中的新增文件?
优化GCS桶到打印机热文件夹的同步脚本
核心问题解答
gsutil rsync原生支持增量同步,默认会对比源(GCS存储桶)和目标目录的文件修改时间、大小,仅同步新增或更新的文件,无需通过遍历备份目录逐一对比的低效方式。结合合适参数,就能直接实现「仅复制上次运行后存储桶新增文件」的需求。
优化思路
- 用gsutil rsync增量同步GCS桶到中间目录,避免全量同步的性能开销;
- 用高效的目录对比工具(robocopy)替代原脚本中的for循环,快速筛选新增文件并复制到热文件夹;
- 保留备份目录作为已处理文件的记录,避免重复发送已打印的文件。
优化后的脚本
@echo off SET SOURCE=%1 SET DESTINATION=%2 SET HOTDIR=%3 SET BACKUPDIR=%4 SET GSUTIL_INST_DIR=C:\PRINT SET GSUTIL=%GSUTIL_INST_DIR%\google-cloud-sdk-386.0.0-windows-x86_64-bundled-python\google-cloud-sdk\bin\gsutil SET GSUTIL=%GSUTIL% -m :: 增量同步GCS桶到中间目录:仅同步新增/更新的文件,保留修改时间 call %GSUTIL% rsync -u -t -C %SOURCE%/ %DESTINATION%/ :: 用robocopy高效对比中间目录和热文件夹,仅复制新增文件 robocopy "%DESTINATION%" "%HOTDIR%" /XO /Y /NP :: /XO: 排除热文件夹已存在的文件(因打印后文件消失,实际仅复制新文件) :: /Y: 自动覆盖同名文件 :: /NP: 不显示进度,提升执行效率 :: 同步中间目录到备份目录,更新已处理文件记录 robocopy "%DESTINATION%" "%BACKUPDIR%" /MIR SET CONFIRMATION= "%DATE% %TIME% %SOURCE% to %HOTDIR%"
关键参数说明
gsutil rsync -u: 仅复制源中比目标新或目标不存在的文件,实现增量同步;gsutil rsync -t: 保留文件的修改时间,确保下次同步时能准确识别新增/更新的文件;robocopy /XO: 高效筛选出热文件夹中没有的文件,替代原脚本中低效的for循环遍历;robocopy /MIR: 镜像同步中间目录到备份目录,确保备份目录与已同步文件完全一致。
额外优化建议
- 如果GCS桶中的文件不会被删除,可去掉
gsutil rsync中的-d参数(原脚本的-d会删除目标目录中源不存在的文件),减少不必要的文件删除操作; - 若无需保留中间目录
DESTINATION,可直接将GCS桶增量同步到BACKUPDIR,再从BACKUPDIR同步新增文件到HOTDIR,进一步简化流程。
内容的提问来源于stack exchange,提问作者Sajjad
相关产品推荐
相关产品推荐

