cr4sync up / cr4sync dl
独立的单文件 / 单目录上传 / 下载原语。不走 SyncEngine,行为简单可预测,保留单文件字节级进度。
up(alias upload)— 上传
cr4sync up <src> <target> [-r] [-f] [--conflict <MODE>]
cr4sync upload ./photo.jpg cloudreve://my/backup/photo.jpg
cr4sync up -rf ./photos cloudreve://my/backup/photos
dl(alias download)— 下载
cr4sync dl <src> <target> [-r] [-f] [--conflict <MODE>]
cr4sync download cloudreve://my/data.zip ./data.zip
cr4sync dl -rf cloudreve://my/photos ./photos
公共参数
| 参数 | 类型 | 默认 | 说明 |
|---|---|---|---|
<src> | string | — | 源路径。up:本地路径;dl:远端 URI。 |
<target> | string | — | 目标路径。up:远端 URI;dl:本地路径。 |
-r, --recursive | flag | false | 递归处理目录。 |
-f, --force | flag | false | 覆盖已存在文件。等价于 --conflict overwrite。 |
--conflict <MODE> | enum | skip | skip(跳过)/ overwrite(覆盖)。 |
-r 与 -f 可堆叠:-rf ≡ -r -f。
行为细节
up
- 单文件:直接
POST /file/upload拿 session → 切片chunk_size→ 顺序上传 → cloudreve callback。 - 单文件分片上传:失败重传从 chunk 0 开始(进程内重试,进程重启会丢,仅低效非数据损坏)。
- 目录递归:广度优先扫描,逐个上传单文件流程。
- 重试次数:
[conf].retry(缺省 3)。
dl
- 单文件:cloudreve
download拿带签名直链 → 单 HTTP GET 流式写入<target>.part,下完原子 rename 到<target>。 .part续传:进程重启后 fs 检测到<target>.part存在 → 计算字节数 →Range: bytes=<n>-续传(同进程内重启 OK,跨进程也 OK)。- 目录递归:cloudreve
list拉目录树 → 逐个下载。
target 路径语义
对齐 cp / scp / wget -O:单文件传输时,target 不一定是目录。
| 场景 | 行为 |
|---|---|
up foo.apk /baidu-migrate/foo.apk (target 不存在) | 上传到 /baidu-migrate/foo.apk (target 当文件路径) |
up foo.apk /baidu-migrate/ (target 是已存在目录) | 上传到 /baidu-migrate/foo.apk (传统 join basename) |
up -rf ./photos /backup/photos (目录递归) | target 始终当目录, 内部文件按相对路径 join |
dl /remote/foo.apk foo.apk (target 不存在) | 下载到 ./foo.apk (target 当文件路径) |
dl /remote/foo.apk ./downloads/ (target 是已存在目录) | 下载到 ./downloads/foo.apk (传统 join basename) |
dl -rf /remote/photos ./photos (目录递归) | target 始终当目录 |
判定规则: src 是文件 + target 不是已存在的目录 → target 当作完整文件路径 (不 join basename)。 其他场景 (src 是目录 / target 是已存在目录) → target 视为目录, 后续按相对路径 join。
冲突策略
| 模式 | up 目标存在 | dl 目标存在 |
|---|---|---|
skip | 跳过该文件 | 跳过该文件 |
overwrite | 删除远端再传 | 删除本地 .part + 目标再传 |
进度展示
单文件字节级 bar:
[####################------] 3.2 MiB/4.0 MiB ( 1.2 MiB/s, ETA 1s) ./photo.jpg
目录递归时多文件按顺序处理(无并发),bar 复用。
错误退出
| 现象 | 原因 |
|---|---|
local io: not found | <src> 本地不存在(up)或 <target> 父目录不存在(dl) |
remote: 404 | 远端路径不存在(dl)或目标父目录不存在(up) |
auth: token expired | token.json 过期且 refresh 失败 → cr4sync login |
conflict: target exists | 冲突 skip 模式遇到目标存在(信息性,不是错误) |