rclone 与 tar 命令使用笔记

一、rclone 基础操作

1.1 复制文件到 Google Drive

将本地 ABC 三个文件夹下的 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.xz

1.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.yml

2.2 参数详解

参数全称作用
-ccreate创建归档文件
-vverbose显示详细处理过程
-JJ (xz)使用 xz 压缩算法
-ffile指定归档文件名(必须放最后)
-Pabsolute-names保留绝对路径开头的 /(不推荐)
-Cdirectory先切换到指定目录

2.3 压缩算法对比

参数算法扩展名压缩比速度
-Jxz.tar.xz最高最慢
-zgzip.tar.gz中等中等
-jbzip2.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/null

2.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 --progress

3.2 流量消耗说明

上传流量 = 压缩后的数据大小,不是原始文件大小

阶段数据大小是否消耗流量
读取原始文件100 MB❌ 本地磁盘
tar 压缩10 MB❌ CPU 计算
rclone 上传10 MB流量

四、加密压缩

tar 本身不支持加密,需要配合 gpgopenssl

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 -xJ

4.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 -xJ

4.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 加密方式对比

特性GPGOpenSSL
安全性高 (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 --progress

5.2 从 Google Drive 下载并解密恢复

# 下载 → 解密 → 解压
rclone copy zgdrive:/backup-20250101.tar.xz.gpg /tmp/
gpg --decrypt /tmp/backup-20250101.tar.xz.gpg | tar -xJ -C /

六、安全提醒

  1. 不要泄露密码:使用强密码(大小写字母+数字+特殊符号)
  2. 不要在命令行明文写密码-pass pass:123456 会保存在 bash history 中
  3. 使用 --dry-run:删除或覆盖前先演习
  4. 定期测试恢复:确保备份文件可以正常解密和解压

以下是关于 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.txt

2.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-run

5.2 保留历史版本

使用时间戳或日期目录:

# 按日期创建目录
DATE=$(date +%Y-%m-%d)
rclone copy /local/data remote:/backup/$DATE/

# 或使用时间戳文件名
rclone copy /local/file.txt remote:/backup/file-$(date +%s).txt

5.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:管道直写,无脑覆盖

标签: none

添加新评论