增量同步删除上传对象
功能说明
在增量同步上传的基础上,删除OBS目标桶中在本地源路径下已不存在的对象,使本地源路径与OBS目标桶的内容完全一致。此处的增量同步删除有三层含义:
- 增量,依次比较源文件和目标对象,只上传存在变化的源文件。
- 同步,命令执行完成后,保证本地源路径是OBS指定目标桶的子集,即本地源路径下的所有文件均能在OBS指定目标桶中找到对应对象。
- 删除,命令执行完成后,OBS目标桶中在本地源路径下没有对应文件的对象将被删除,即目标桶中多余的对象将被清除。
- 同步删除上传时,请确保本地文件或文件夹在同步过程不发生变化,否则可能产生同步失败或者数据不一致的问题。
- 同步上传每个文件时会对比桶中对应路径的对象,仅在对象不存在,或者对象大小与文件大小不一致,或者对象的最后修改时间早于文件的最后修改时间时进行上传。
- 使用-delete参数会删除OBS桶中的对象,该操作不可逆,请谨慎使用。建议在执行删除前,先使用-dryRun参数进行测试,确认待删除的对象列表是否符合预期。
- 如果源路径为空目录,命令将拒绝执行并报错,以防止误删除桶内全部对象。
- 如果目标桶未开启版本控制,被删除的对象将无法恢复。建议开启桶版本控制以防止数据误删除。
- 如果未指定目标对象名前缀(key),命令将扫描整个桶并可能删除桶内所有不在本地源路径中的对象,请务必确认后再执行。
- 使用-delete参数时,命令会在执行删除前要求确认;如需跳过确认,请配合-f参数使用。
在比较每个本地文件与桶内对象差异时,会产生一次HEAD请求费用。在扫描目标桶中待删除对象时,会产生LIST请求费用。
命令结构
- sync命令
sync命令自带增量同步能力,直接使用-delete参数即可:
- Windows操作系统
obsutil sync folder_url obs://bucket[/key] [-delete] [-f] [-arcDir=xxx] [-dryRun] [-link] [-vlength] [-vmd5] [-p=1] [-threshold=52428800] [-acl=xxx] [-sc=xxx] [-meta=aaa:bbb#ccc:ddd] [-ps=auto] [-o=xxx] [-cpd=xxx] [-fr] [-config=xxx] [-e=xxx] [-i=xxx] [-k=xxx] [-t=xxx]
- macOS/Linux操作系统
./obsutil sync folder_url obs://bucket[/key] [-delete] [-f] [-arcDir=xxx] [-dryRun] [-link] [-vlength] [-vmd5] [-p=1] [-threshold=52428800] [-acl=xxx] [-sc=xxx] [-meta=aaa:bbb#ccc:ddd] [-ps=auto] [-o=xxx] [-cpd=xxx] [-fr] [-config=xxx] [-e=xxx] [-i=xxx] [-k=xxx] [-t=xxx]
- Windows操作系统
- cp命令
cp命令需同时使用-u、-r和-delete参数:
- Windows操作系统
obsutil cp folder_url obs://bucket[/key] -r -u [-delete] [-f] [-arcDir=xxx] [-dryRun] [-link] [-vlength] [-vmd5] [-p=1] [-threshold=52428800] [-acl=xxx] [-sc=xxx] [-meta=aaa:bbb#ccc:ddd] [-ps=auto] [-o=xxx] [-cpd=xxx] [-fr] [-config=xxx] [-e=xxx] [-i=xxx] [-k=xxx] [-t=xxx]
- macOS/Linux操作系统
./obsutil cp folder_url obs://bucket[/key] -r -u [-delete] [-f] [-arcDir=xxx] [-dryRun] [-link] [-vlength] [-vmd5] [-p=1] [-threshold=52428800] [-acl=xxx] [-sc=xxx] [-meta=aaa:bbb#ccc:ddd] [-ps=auto] [-o=xxx] [-cpd=xxx] [-fr] [-config=xxx] [-e=xxx] [-i=xxx] [-k=xxx] [-t=xxx]
- Windows操作系统
- cp命令使用-delete时,必须同时指定-u(增量)和-r(递归文件夹)参数,否则会报错。
- sync命令自带增量同步能力,无需额外指定-u和-r参数。
- -delete参数仅支持上传模式(本地→OBS),不支持下载模式或复制模式。
运行示例
假设本地文件夹的内容如下:
└── src1
├── src2
├── test1.txt
└── test2.txt
└── test3.txt 假设bucket-test桶内包含如下对象:
obs://bucket-test/src1/ obs://bucket-test/src1/src2/ obs://bucket-test/src1/src2/test1.txt obs://bucket-test/src1/src2/old.txt obs://bucket-test/src1/legacy.txt
- 以Linux操作系统为例,运行./obsutil sync /src1 obs://bucket-test/src1 -delete,增量同步上传并删除桶中多余对象。
执行过程如下:
- 增量上传本地有变化的文件(test2.txt、test3.txt)。
- 扫描桶内对象,找出本地不存在对应文件的对象(old.txt、legacy.txt)。
- 提示确认是否删除,输入y确认后删除old.txt和legacy.txt。
./obsutil sync /src1 obs://bucket-test/src1 -delete Start at 2024-09-25 04:48:10.1147483 +0000 UTC Parallel: 5 Jobs: 5 Threshold: 50.00MB PartSize: auto VerifyLength: false VerifyMd5: false CheckpointDir: /root/.obsutil_checkpoint Task id: 104786c8-27c2-48fc-bc6a-5886596fb0ed OutputDir: /root/.obsutil_output [========================================================] 100.00% tps:35.71 2.02 KB/s 7.20MB/7.20MB 0s Succeed count: 5 Failed count: 0 Succeed bytes: xxxx Metrics [max cost:90 ms, min cost:45 ms, average cost:63.80 ms, average tps:35.71, transferred size: 7.20MB] [Pre-scan] Local file count: 3 [Pre-scan] Scanning OBS objects under obs://bucket-test/src1/ ... [Pre-scan] OBS objects scanned: 4, objects to delete: 2 Found 2 objects to delete in obs://bucket-test/src1/ Full list saved to: /root/.obsutil_output/sync_delete_target_files_20240925_104810_104786c8.txt Please input (y/n) to confirm: y [Step 5/6] Deleting 2 objects from obs://bucket-test/src1/ ... [Step 6/6] Delete completed: succeed 2, failed 0 Task id: 104786c8-27c2-48fc-bc6a-5886596fb0ed
- 以Linux操作系统为例,运行**./obsutil sync /src1 obs://bucket-test/src1 -delete -f**,跳过确认提示直接删除。
./obsutil sync /src1 obs://bucket-test/src1 -delete -f
使用-f参数后,删除前不会弹出确认提示,直接执行删除操作。适用于脚本自动化场景。
- 以Linux操作系统为例,运行**./obsutil sync /src1 obs://bucket-test/src1 -delete -dryRun**,仅测试不实际执行
./obsutil sync /src1 obs://bucket-test/src1 -delete -dryRun
使用-dryRun参数后,命令仅输出将要上传和删除的文件列表,不会实际执行上传和删除操作。建议首次使用-delete时先用-dryRun确认结果。
- 以Windows操作系统为例,运行obsutil cp d:\temp obs://bucket-test/temp -r -u -delete,使用cp命令增量同步删除上传。
obsutil cp d:\temp obs://bucket-test/temp -r -u -delete
cp命令使用-delete时,需同时指定-r和-u参数,否则会报错。
- 更多运行示例,请参见常见示例。
参数说明
以下仅列出与增量同步删除相关的参数,其他参数请参见增量同步上传对象。
| 参数 | 约束 | 描述 |
|---|---|---|
| delete | 附加参数,可选 | 增量同步上传时,删除OBS目标桶中在本地源路径下没有对应文件的对象。仅支持上传模式(本地→OBS)。使用cp命令携带该参数时,必须同时指定-u和-r参数;使用sync命令时无需额外参数 |
| f | 附加参数,使用-delete时可选 | 跳过-delete操作的确认提示。不指定该参数时,执行删除前会要求用户确认;指定该参数后直接执行删除,不再提示确认。 |
| dryRun | 附加参数,可选 | 测试模式运行,不执行实际的上传和删除操作,仅输出将要操作的文件列表。建议首次使用-delete时配合该参数确认结果。 |
常见问题
- 使用-delete时报错"source is empty, --delete is not allowed"
源路径为空目录时,命令将拒绝执行。这是为了防止误删除桶内全部对象。请检查源路径是否正确,确保源目录中包含需要上传的文件。
- 使用-delete时报错"no files matched for upload, --delete is not allowed"
源路径下的文件全部被过滤条件(如-include、-exclude、-timeRange)排除,导致没有需要上传的文件。此时不允许执行删除操作,以避免删除不应删除的对象。请检查过滤条件是否过于严格。
- 使用-delete时报错"--delete is only supported in upload mode"
-delete参数仅支持上传模式(本地→OBS),不支持下载模式或桶间复制模式。请确保命令的源路径为本地路径,目标路径为OBS桶路径。
- 使用cp命令时报错"--delete must be used together with -u (--update)"
使用cp命令的-delete参数时,必须同时指定-u(--update)参数以启用增量模式。
- 使用cp命令时报错"--delete must be used together with -r to upload folder"
使用cp命令的-delete参数时,必须同时指定-r参数以指定上传文件夹。
- 桶未开启版本控制时出现警告
当目标桶未开启版本控制时,命令会输出警告信息。因为未开启版本控制的桶中对象被删除后无法恢复,建议开启桶版本控制以防止数据误删除。