rclone与tar命令使用笔记
rclone 与 tar 命令使用笔记
一、rclone 基础操作
1.1 复制文件到 Google Drive
将本地 A、B、C 三个文件夹下的 podman.yml 分别复制到 Google Drive 对应文件夹:
# 方法一:逐个执行
rclone copy ./A/podman.yml googledrive:A/ --create-dir-suffix ""
rclone copy ./B/podman.yml googledrive:B/ --create-dir-suffix ""
rclone copy ./C/podman.yml googledrive:C/ --create-dir-suffix ""
# 方法二:使用循环
for dir in A B C; do
rclone copy "./$dir/podman.yml" "googledrive:$dir/" --create-dir-suffix ""
done注意:
rclone copy不会覆盖已存在的文件(除非加--ignore-existing或--overwrite)- 目标路径末尾的
/表示目标是一个目录 - rclone 不支持一次复制多个源到多个目标
1.2 上传文件到 Google Drive
# 上传本地文件
rclone copy /tmp/file.tar.xz zgdrive:/
# 从标准输入直接写入远程文件
rclone rcat zgdrive:/file.tar.xz1.3 删除文件
| 命令 | 用途 |
|---|---|
rclone deletefile | 删除单个文件 |
rclone purge | 删除整个目录(连根拔起) |
rclone delete | 批量/选择性删除文件 |
# 删除单个文件
rclone deletefile zgdrive:/backup/old.txt
# 删除整个目录
rclone purge zgdrive:/expired_data
# 批量删除 .tmp 文件
rclone delete zgdrive:/data --include "*.tmp"
# 删除大于 100M 的文件
rclone delete zgdrive:/data --min-size 100M
# 演习模式(不实际删除)
rclone delete zgdrive:/data --min-size 100M --dry-run二、tar 压缩命令详解
2.1 基本用法
# 压缩指定文件
tar -cvJf D.tar.xz A/podman.yml B/podman.yml C/podman.yml
# 使用花括号扩展
tar -cvJf D.tar.xz {A,B,C}/podman.yml
# 压缩到标准输出(不写文件)
tar -cvJ /data/{caddy,linkding,vaultwarden}/podman-compose.yml2.2 参数详解
| 参数 | 全称 | 作用 |
|---|---|---|
-c | create | 创建归档文件 |
-v | verbose | 显示详细处理过程 |
-J | J (xz) | 使用 xz 压缩算法 |
-f | file | 指定归档文件名(必须放最后) |
-P | absolute-names | 保留绝对路径开头的 /(不推荐) |
-C | directory | 先切换到指定目录 |
2.3 压缩算法对比
| 参数 | 算法 | 扩展名 | 压缩比 | 速度 |
|---|---|---|---|---|
-J | xz | .tar.xz | 最高 | 最慢 |
-z | gzip | .tar.gz | 中等 | 中等 |
-j | bzip2 | .tar.bz2 | 较高 | 较慢 |
2.4 关于 tar: Removing leading '/' 警告
这是正常行为,不是错误。tar 默认移除绝对路径开头的 /:
- 压缩
/data/caddy/file.yml→ 存储为data/caddy/file.yml - 解压时文件会放到当前目录的
./data/下,而不是/data/
消除警告的方法:
# 方法1:使用相对路径
cd /data && tar -cvJf /tmp/backup.tar.xz {caddy,linkding}/file.yml
# 方法2:使用 -C 参数
tar -cvJf /tmp/backup.tar.xz -C /data {caddy,linkding}/file.yml
# 方法3:屏蔽警告(不推荐)
tar -cvJf file.tar.xz /path 2>/dev/null2.5 查看压缩包内容
# 列出文件(不解压)
tar -tf archive.tar.xz
# 详细列出
tar -tvf archive.tar.xz三、tar + rclone 组合:直接上传压缩包
3.1 基础组合
# 压缩并通过管道上传(不产生临时文件)
tar -cvJ /data/{caddy,linkding,vaultwarden}/podman-compose.yml | rclone rcat zgdrive:/GCE1.tar.xz --progress3.2 流量消耗说明
上传流量 = 压缩后的数据大小,不是原始文件大小
| 阶段 | 数据大小 | 是否消耗流量 |
|---|---|---|
| 读取原始文件 | 100 MB | ❌ 本地磁盘 |
| tar 压缩 | 10 MB | ❌ CPU 计算 |
| rclone 上传 | 10 MB | ✅ 流量 |
四、加密压缩
tar 本身不支持加密,需要配合 gpg 或 openssl。
4.1 使用 GPG 加密(推荐)
# 对称加密(交互式输入密码)
tar -cJ /data/{caddy,linkding,vaultwarden}/podman-compose.yml | gpg --symmetric --cipher-algo AES256 | rclone rcat zgdrive:/backup.tar.xz.gpg --progress
# 使用文件传密码(自动化脚本)
echo "your-password" > /tmp/pass.txt
chmod 600 /tmp/pass.txt
tar -cJ /data/{...} | gpg --symmetric --batch --passphrase-file /tmp/pass.txt --cipher-algo AES256 | rclone rcat zgdrive:/backup.tar.xz.gpg
rm /tmp/pass.txt
# 解密并解压
gpg --decrypt backup.tar.xz.gpg | tar -xJ4.2 使用 OpenSSL 加密
# 交互式输入密码
tar -cJ /data/{caddy,linkding,vaultwarden}/podman-compose.yml | openssl enc -aes-256-cbc -salt -pbkdf2 | rclone rcat zgdrive:/backup.tar.xz.enc --progress
# 使用环境变量
export ENC_PASS="your-password"
tar -cJ /data/{...} | openssl enc -aes-256-cbc -salt -pbkdf2 -pass env:ENC_PASS | rclone rcat zgdrive:/backup.tar.xz.enc
# 解密并解压
openssl enc -d -aes-256-cbc -pbkdf2 -in backup.tar.xz.enc | tar -xJ4.3 常见错误
# ❌ 错误:-out 会写入本地文件,导致管道中断
tar ... | openssl ... -out backup.enc | rclone rcat ...
# ✅ 正确:使用 /dev/stdout 或省略 -out
tar ... | openssl ... -out /dev/stdout | rclone rcat ...
tar ... | openssl ... | rclone rcat ...4.4 加密方式对比
| 特性 | GPG | OpenSSL |
|---|---|---|
| 安全性 | 高 (AES-256) | 高 (AES-256) |
| 功能丰富度 | 更丰富(支持签名、密钥管理) | 简单直接 |
| 适用场景 | 通用/推荐 | 轻量级加密 |
五、完整工作流示例
5.1 加密备份并上传到 Google Drive
# 一次性完成:打包 → 压缩 → 加密 → 上传
tar -cJ /data/{caddy,linkding,vaultwarden}/podman-compose.yml /data/m.ini | gpg --symmetric --cipher-algo AES256 | rclone rcat zgdrive:/backup-$(date +%Y%m%d).tar.xz.gpg --progress5.2 从 Google Drive 下载并解密恢复
# 下载 → 解密 → 解压
rclone copy zgdrive:/backup-20250101.tar.xz.gpg /tmp/
gpg --decrypt /tmp/backup-20250101.tar.xz.gpg | tar -xJ -C /六、安全提醒
- 不要泄露密码:使用强密码(大小写字母+数字+特殊符号)
- 不要在命令行明文写密码:
-pass pass:123456会保存在 bash history 中 - 使用
--dry-run:删除或覆盖前先演习 - 定期测试恢复:确保备份文件可以正常解密和解压
以下是关于 rclone 上传文件时的覆盖行为 的完整笔记,已整理为 Markdown 格式:
rclone 上传覆盖行为详解
一、核心结论
rclone 的覆盖行为取决于使用的命令和参数:
| 命令 | 默认行为 | 是否检查差异 |
|---|---|---|
rclone copy | 有差异才覆盖,相同则跳过 | ✅ 是 |
rclone sync | 强制保持一致(覆盖 + 删除多余文件) | ✅ 是 |
rclone move | 覆盖差异文件后删除源文件 | ✅ 是 |
rclone rcat | 无条件直接覆盖(不检查) | ❌ 否 |
rclone copyto | 有差异才覆盖 | ✅ 是 |
rclone moveto | 覆盖差异文件后删除源 | ✅ 是 |
二、各命令详解
2.1 rclone copy / copyto
默认行为:比较源和目标文件的大小、修改时间(或哈希值),仅当有差异时才覆盖。
# 复制文件/目录
rclone copy /local/file.txt remote:/backup/
# 复制单个文件到指定路径
rclone copyto /local/file.txt remote:/backup/file.txt示例场景:
# 第一次上传
rclone copy config.yml zgdrive:/backup/ # 上传成功
# 第二次上传(文件未修改)
rclone copy config.yml zgdrive:/backup/ # 跳过,不传输
# 第三次上传(文件已修改)
rclone copy config.yml zgdrive:/backup/ # 覆盖上传2.2 rclone sync
默认行为:使目标目录与源目录完全一致。
- 源文件有变化 → 覆盖目标
- 目标有多余文件 → 删除目标文件
rclone sync /local/dir remote:/backup/dir⚠️ 警告:sync会删除目标端多余的文件,使用前务必加上--dry-run演习。
2.3 rclone move / moveto
默认行为:覆盖差异文件,上传成功后删除本地源文件。
# 移动文件/目录
rclone move /local/file.txt remote:/backup/
# 移动单个文件到指定路径
rclone moveto /local/file.txt remote:/backup/file.txt2.4 rclone rcat
默认行为:从标准输入读取数据,无条件直接覆盖远程文件。
# 从管道读取并写入远程(不检查是否已存在)
echo "data" | rclone rcat remote:/file.txt
tar -czf - /data | rclone rcat remote:/backup.tar.gz⚠️ 特点:无差异检查,直接覆盖,适合流式上传且不需要保留历史的场景。
三、控制覆盖行为的参数
3.1 参数速查表
| 参数 | 作用 | 适用命令 |
|---|---|---|
--ignore-existing | 忽略已存在的文件,不覆盖 | copy, sync, move |
-u / --update | 仅当源文件更新时才覆盖 | copy, sync, move |
--checksum | 基于哈希值比较,忽略修改时间 | copy, sync, move |
-I / --ignore-times | 强制覆盖,不比较任何信息 | copy, sync, move |
--dry-run | 演习模式,不实际执行 | 所有命令 |
3.2 详细说明
--ignore-existing
完全忽略已存在的文件,即使源文件更新了也不覆盖。
# 只上传新文件,不覆盖任何已存在的文件
rclone copy /local/data remote:/backup/ --ignore-existing-u / --update
仅当源文件比目标文件新时才覆盖(基于修改时间)。
# 只上传更新的文件
rclone copy /local/data remote:/backup/ -u--checksum
基于文件哈希值比较,忽略修改时间和大小差异。
# 严格按内容比较,确保文件完整性
rclone copy /local/data remote:/backup/ --checksum-I / --ignore-times
强制覆盖所有文件,不进行任何比较。
# 无条件重新上传所有文件
rclone copy /local/data remote:/backup/ -I--dry-run
演习模式,只显示将要执行的操作,不实际执行。
# 演习:查看哪些文件会被上传/覆盖/删除
rclone sync /local/data remote:/backup/ --dry-run四、针对 rclone rcat 的特殊处理
由于 rcat 默认直接覆盖,如需避免覆盖,可以采用以下方案:
方案一:使用带时间戳的文件名(推荐)
# 每次生成新文件名,避免冲突
BACKUP_NAME="backup-$(date +%Y%m%d_%H%M%S).tar.xz"
tar -czf - /data | rclone rcat "remote:/$BACKUP_NAME"方案二:上传前检查是否存在
# 检查文件是否存在,存在则跳过
if ! rclone ls remote:/backup.tar.xz 2>/dev/null | grep -q .; then
tar -czf - /data | rclone rcat remote:/backup.tar.xz
else
echo "文件已存在,跳过上传"
fi方案三:改用 rclone copyto 配合参数
# 先写临时文件,再复制(可控制覆盖行为)
tar -czf - /data > /tmp/backup.tar.xz
rclone copyto /tmp/backup.tar.xz remote:/backup.tar.xz --ignore-existing
rm /tmp/backup.tar.xz五、安全最佳实践
5.1 演习模式
任何破坏性操作前,先演习:
# 删除前演习
rclone delete remote:/data --min-size 100M --dry-run
# 同步前演习
rclone sync /local remote:/backup --dry-run
# 覆盖前演习
rclone copy /local remote:/backup --dry-run5.2 保留历史版本
使用时间戳或日期目录:
# 按日期创建目录
DATE=$(date +%Y-%m-%d)
rclone copy /local/data remote:/backup/$DATE/
# 或使用时间戳文件名
rclone copy /local/file.txt remote:/backup/file-$(date +%s).txt5.3 版本管理策略
| 策略 | 命令示例 | 适用场景 |
|---|---|---|
| 保留最新 | rcat 直接覆盖 | 临时文件、缓存 |
| 保留历史 | 时间戳文件名 | 重要备份 |
| 增量备份 | copy -u | 日常同步 |
| 镜像同步 | sync --dry-run | 灾备恢复 |
六、快速参考卡片
常用场景命令
# 安全上传(有差异才覆盖)
rclone copy /local/file remote:/backup/
# 强制上传所有文件
rclone copy /local/file remote:/backup/ -I
# 只上传新文件
rclone copy /local/file remote:/backup/ --ignore-existing
# 只上传更新的文件
rclone copy /local/file remote:/backup/ -u
# 流式上传(直接覆盖)
tar -czf - /data | rclone rcat remote:/backup.tar.gz
# 流式上传 + 时间戳(避免覆盖)
tar -czf - /data | rclone rcat "remote:/backup-$(date +%Y%m%d).tar.gz"
# 镜像同步(危险,先演习)
rclone sync /local remote:/backup --dry-run记忆口诀
- copy:聪明复制,有变才覆
- sync:强制同步,多余就删
- move:复制搬家,源件不见
- rcat:管道直写,无脑覆盖