通过 tar + 管道(pipe)+ rclone rcat 的方式,可以实现“边打包边上传”的流式操作,无需在本地生成压缩文件,大幅节省磁盘空间并减少 IO。
一、流式上传的原理
- tar:负责压缩并将数据输出到标准输出(stdout)
- 管道 |:将前一个命令的输出传给下一个命令
- tee:将同一份数据流分发到多个进程
- rclone rcat:从标准输入接收数据并直接上传到云盘
通过这些组合,可以做到“一次压缩,同时上传到多个云服务”。
二、示例:一次打包同时上传到天翼盘、百度网盘、移动云盘(通过 Alist)
tar --zstd -cf - -C /root/docker . \
| tee \
>(rclone rcat --progress alist:/天翼/docker/docker_$(date +%Y%m%d).tar.zst) \
>(rclone rcat --progress alist:/移动/Rclone/docker/docker_$(date +%Y%m%d).tar.zst) \
| rclone rcat --progress alist:/百度/docker/docker_$(date +%Y%m%d).tar.zst
三、命令详解
1. tar 压缩部分
tar --zstd -cf - -C /root/docker .
--zstd:使用 zstd 压缩算法(速度快、压缩率高)-c:创建压缩包-f -:输出到标准输出(-代表 stdout)-C /root/docker .:进入指定目录后压缩该目录所有内容
为什么推荐 zstd?
- 比 gzip 更快
- 压缩率更高
- CPU 利用效率更好 适合大型数据备份场景。
2. tee 实现多目标同步上传
tee >(rclone rcat ...)
tee:复制数据流到多个“接收者”>( ... ):进程替换,意味着把数据传递给括号内的命令
3. 每个云盘的 rclone rcat 上传
上传到天翼云:
rclone rcat --progress alist:/天翼/docker/docker_20240101.tar.zst
上传到移动云盘:
rclone rcat --progress alist:/移动/Rclone/docker/docker_20240101.tar.zst
上传到百度网盘(主流最后一条管道):
rclone rcat --progress alist:/百度/docker/docker_20240101.tar.zst
每个目标路径都可以根据你的 Alist 目录结构自由修改。
四、效果
- 一次压缩,多处上传 无需重复打包三次,节省时间和 CPU。
- 无需本地生成 tar 文件 所有数据全程通过管道传输。
- 减少磁盘 IO、降低空间占用 非常适合大数据备份、服务器资源有限等场景。