Rclone基础教程

​ Rclone是一个用于管理云存储文件的命令行程序。它是云存储供应商网页存储界面的一个功能丰富的替代方案。超过70种云存储产品支持rclone,包括S3对象存储、企业和个人文件存储服务,以及标准传输协议。

​ Rclone拥有与Unix命令rsync、cp、mv、mount、ls、ncdu、tree、rm和cat相对应的强大云命令。Rclone熟悉的语法支持shell管道,并且有--dry-run保护机制。它可以在命令行中使用,也可以在脚本中使用,还可以通过其API使用。

​ 人称rclone:云存储的瑞士军刀

官网

https://rclone.orgopen in new window

rclone中文站

https://rclone.cnopen in new window

1、安装启动

windows

在cmd运行

#命令进行设置
./rclone config

#启动web页面配置
./rclone rcd --rc-web-gui --rc-user=<用户名> --rc-pass=<密码>

linux

#解压
unzip rclone-current-linux-amd64.zip
#进入目录
cd rclone-*-linux-amd64
#复制文件
cp rclone /usr/bin/
#授权
chown root:root /usr/bin/rclone
chmod 755 /usr/bin/rclone
#安装手册
mkdir -p /usr/local/share/man/man1
cp rclone.1 /usr/local/share/man/man1/
mandb
#启动配置
rclone config

2、配置

首先,你需要配置 rclone。 由于对象存储系统 有相当复杂的身份验证,这些都保存在配置文件中。

创建配置文件的最简单方法是运行 rclone,并在配置文件中加入 选项运行 rclone:

rclone config
#输入n (New remote)
n
#输入远程项目配置名称
xxx
#选远程项目协议(这边选择S3 编号:3)
4
# 51 / Any other S3 compatible provider
#    \ (Other) 选51 其他s3
51
#env_auth 用key认证直接回车
回车
#access_key_id 访问密钥
访问密钥
#secret_access_key 输入secret密钥
密钥
#region 回车
回车
#endpoint 输入对象存储地址及端口
http://192.168.188.14:9001
#location_constraint 回车
#acl 回车
#bucket_object_lock_enabled 回车
#Edit advanced config 选择 n 不配高级配置
n
#Keep this "xxx" remote 确认配置 y
y
#Quit config退出交互配置 q
q

基础语法

rclone 用于将一个存储系统中的目录树同步到另一个存储系统。

rclone 子命令 [选项] <参数> <参数...>

#子命令 是 rclone 所需执行的操作(例如 sync、copy、ls)。
#选项 可以是单个字母标志(例如 -v)、一组单个字母标志(例如 -Pv)或长标志(例如 --progress)。选项并非必需。选项可以放在 子命令 之后、参数之间或命令末尾,但只有全局选项可以放在 子命令 之前。-- 选项之后的任何内容都不会被解释为选项,因此如果需要添加以 - 开头的参数,请先单独使用 --,例如:
rclone lsf -- -以破折号开头的目录

#参数 通常是文件路径或 rclone 远程存储,例如 /path/to/file 或 remote:path/to/file,但也可以是其他内容,具体取决于 子命令 的帮助说明。

子命令

rclone 使用子命令系统。例如:

#列出所有远程
rclone listremotes
# 查看配置文件位置
rclone config file
# 列出远程存储的内容(远程名:目录名字)
rclone ls remote:path 
./rclone ls rsy:fileos 
# 只列出文件夹
rclone lsd xxx:fileos
# 树形展示目录
rclone tree xxx:fileos
#查看文件详情(含修改时间)
rclone lsl xxx:fileos
# 将本地路径下的内容复制到远程存储
rclone copy /local/path remote:path 
# 将本地路径下的内容同步到远程存储
rclone sync --interactive /local/path remote:path 

copy

基础复制(s3 → S3)

前提:配置好两个 remote(假设:xxx 源桶,yyy 目标桶)

#基础复制(推荐,增量复制,跳过相同文件)
rclone copy xxx:源桶名 yyy:目标桶名

假设你有一个远程文件,其中有一个名为 test.jpg “的远程文件,那么你可以像这样复制该文件到本地

#test.jpg “文件将被放在”/tmp/download “中
rclone copy remote:test.jpg /tmp/download

增量复制,只传新/改动文件

rclone copy /data aliyun:/Data --progress

--progress 实时显示进度

copyto

将文件从源位置复制到目标位置,跳过相同的文件。

rclone copyto xxx:源桶名 yyy:目标桶名

和copy区别只有操作单个文件时才有区别!

#批量备份文件夹(优先用 copy)单个文件上传并重命名(必须 copyto)
rclone copyto D:/film.mp4 aliyun:/影视/2026_film.mp4

sync

同步(镜像,目标和源完全一致,删除目标多余文件)

适合备份镜像,不要搞反源和目标

#谨慎使用,会删除目标桶里源不存在的文件
rclone sync xxx:源桶名 yyy:目标桶名

move

移动文件(复制完成后删除源文件)

rclone move xxx:源桶名 yyy:目标桶名

delete

删除操作(高危!建议先测试)

# 删除远端单个文件
rclone delete xxx:桶名/虚拟机.zip
# 删除目录内文件(保留文件夹本身)
rclone delete xxx:/Trash
# 删除整个目录(连同文件夹)
rclone rmdir xxx:/OldDir
# 递归删除目录及所有内容(存储桶都删了)
rclone purge xxx:桶名
#删除前先加 --dry-run 模拟执行,不真实操作
rclone purge xxx:桶名 --dry-run

过滤示例

# 只同步 mp4/mkv,排除缓存文件
#--exclude .cache/**    # 排除缓存文件
#--include *.mp4    # 只同步mp4/mkv文件
rclone sync /media aliyun:/Video --include *.mp4 --include *.mkv --exclude .cache/**

Rclone 的匹配规则遵循 glob 风格

*         #匹配任意非分隔符(/)字符序列
**        #匹配任意字符序列,包括 / 分隔符
?         #匹配任意单个非分隔符(/)字符
[ [ ! ] { character-range } ]
          #字符类(必须非空)
{ pattern-list }
          #模式备选项
{{ regexp }}
          #要匹配的正则表达式
c         #匹配字符 c(c 不等于 *, **, ?, \, [, {, })
\c        #匹配保留字符 c(c 等于 *, **, ?, \, [, {, }) 或字符类

根目录匹配

file.jpg   # 匹配 "file.jpg"
           # 匹配 "directory/file.jpg"
           # 不匹配 "afile.jpg"
           # 不匹配 "directory/afile.jpg"
/file.jpg  # 匹配远程存储根目录下的 "file.jpg"
           # 不匹配 "afile.jpg"
           # 不匹配 "directory/file.jpg"

--exclude 不应与 --include--include-from--filter--filter-from 标志一起使用。

--exclude--files-from--files-from-raw 标志结合使用时无效。

--exclude		 # 排除匹配模式的文件
--exclude-from 	 # 从文件中读取排除模式 
rclone ls remote: --exclude-from exclude-file.txt
#exclude-file.txt
# 一个示例排除规则文件
*.bak
file2.jpg

--include 		# 包含匹配模式的文件 
--include-from  # 从文件中读取包含模式
rclone ls remote: --include-from include-file.txt

--filter 		# 添加文件过滤规则 
#会从 remote: 的列表中排除所有 .bak 文件。
#根据单个包含或排除规则,以 + 或 - 格式指定路径/文件名到 rclone 命令中
rclone ls remote: --filter "- *.bak"

--filter-from  # 从文件中读取过滤模式
#filter-file.txt
# 一个示例过滤规则文件
- secret*.jpg
+ *.jpg
+ *.png
+ file2.avi
- /dir/tmp/** # 警告!此文本将被视为路径的一部分。
- /dir/Trash/**
+ /dir/**
# 排除其他所有内容
- *

--files-from   # 读取源文件名列表
rclone copy --files-from files-from.txt /home/me/pics remote:pics
#files-from.txt
# 注释
file1.jpg
subdir/file2.jpg
#会复制以下文件(如果存在),并且仅复制这些文件。
#/home/me/pics/file1.jpg        → remote:pics/file1.jpg
#/home/me/pics/subdir/file2.jpg → remote:pics/subdir/file2.jpg

--files-from-raw 	# 无处理地读取源文件名列表 
--ignore-case 	 	# 使搜索不区分大小写 
--min-size 		 	# 不传输小于此大小的文件 
--max-size 		 	# 不传输大于此大小的文件 
--max-age 		 	# 不传输早于此时间的文件
--min-age 		 	# 不传输晚于此时间的文件

#其他标志
--delete-excluded   # 删除同步中排除的目标文件
--dump filters      # 将过滤器输出到标准输出 

文件校验

对比源与目标是否一致

# 只对比哈希,不传输
rclone check /local aliyun:/Backup

# 输出不一致文件清单
rclone check /local aliyun:/Backup --differ diff.txt

创建 / 统计 / 大小查询

# 创建远端文件夹
rclone mkdir aliyun:/NewFolder

# 统计目录总大小
rclone size aliyun:/Backup

# 计算占用空间(人类可读)
rclone du aliyun:/

挂载

Linux 挂载远端到本地目录

# 创建挂载点
mkdir -p /mnt/aliyun

# 前台挂载(调试用)
rclone mount aliyun:/ /mnt/aliyun --allow-non-empty --allow-other --vfs-cache-mode writes

# 后台守护挂载(常用)
nohup rclone mount aliyun:/ /mnt/aliyun --allow-non-empty --allow-other --vfs-cache-mode writes &

# 卸载
fusermount -u /mnt/aliyun

参数说明:

  • --vfs-cache-mode writes:开启写入缓存,支持修改文件
  • --allow-other:允许其他用户访问

Windows 挂载推荐搭配 WinFsp,命令格式一致。

常用实用参数

直接追加在命令末尾

# 多并发上传下载(S3推荐,加快速度)
--transfers 10

# 打印实时日志
-v
# 详细调试日志
-vv

# 不实际执行,只预览操作(试运行!强烈建议先跑dry-run)
--dry-run

# 保留文件元数据、存储类别、权限
--s3-copy-cutoff 0

# 跳过已存在且大小+修改时间一致的文件(默认开启)
--size-only      # 只对比大小(更快,不校验时间)

--progress          # 实时进度条
--transfers 4       # 并行上传/下载数量(默认4,可调整8/16)
--bwlimit 1M        # 限速 1MB/s,单位 k|M|G
--dry-run           # 模拟运行,只打印不执行!测试必备
--exclude *.log     # 排除后缀log文件
--include *.pdf     # 只同步pdf文件
--delete-excluded   # sync时删除被排除的文件
--retries 3         # 失败重试3次
--check             # 传输完成校验文件哈希

常见组合速查清单

  1. 测试同步逻辑:rclone sync A B --dry-run
  2. 日常安全备份:rclone copy A B --progress
  3. 镜像备份:rclone sync A B --progress
  4. 挂载网盘:rclone mount remote:/ /mnt/path --vfs-cache-mode writes
  5. 清理垃圾目录:rclone purge remote:/trash --dry-run

热备脚本

#!/bin/bash
#
# Rclone 热备份脚本
# 功能:
#   1. 本地 S3 多个存储桶 → 远程 S3 对应存储桶
#   2. 本地 /data/FTP 目录 → 远程 S3 存储桶
#

set -euo pipefail

# ======================== 配置区 ========================

# Rclone 远程名称(在 rclone config 中配置的)
LOCAL_S3_REMOTE="local_s3"    # 本地 S3 remote 名称
REMOTE_S3_REMOTE="remote_s3"  # 远程 S3 remote 名称

# 本地 S3 存储桶列表(空格分隔)
LOCAL_BUCKETS=("rclone" "memos")

# 远程 S3 目标存储桶列表(与上面一一对应)
REMOTE_BUCKETS=("rclone" "memos")

# 本地 FTP 目录
LOCAL_FTP_DIR="/home/FTP/sm"

# 远程 S3 存储桶(用于 FTP 备份)
REMOTE_FTP_BUCKET="sm"

# 日志文件
LOG_DIR="/data/rclone/log"
LOG_FILE="${LOG_DIR}/backup_$(date +%Y%m%d_%H%M%S).log"

# Rclone 通用参数
RCLONE_OPTS=(
    --stats-log-level NOTICE
    --transfers 8
    --checkers 16
    --retries 3
    --low-level-retries 10
    --s3-upload-concurrency 4
    --s3-chunk-size 64M
    --log-file "${LOG_FILE}"
    --log-level INFO
)

# ======================== 函数区 ========================

log_info() {
    echo "[$(date '+%Y-%m-%d %H:%M:%S')] [INFO] $1" | tee -a "${LOG_FILE}"
}

log_error() {
    echo "[$(date '+%Y-%m-%d %H:%M:%S')] [ERROR] $1" | tee -a "${LOG_FILE}" >&2
}

check_rclone() {
    if ! command -v rclone &>/dev/null; then
        log_error "rclone 未安装,请先安装 rclone"
        exit 1
    fi
    log_info "rclone 版本: $(rclone version | head -1)"
}

# 备份 S3 存储桶
backup_s3_buckets() {
    log_info "========== 开始备份 S3 存储桶 =========="

    local bucket_count=${#LOCAL_BUCKETS[@]}
    local failed=0

    for ((i = 0; i < bucket_count; i++)); do
        local src_bucket="${LOCAL_BUCKETS[$i]}"
        local dst_bucket="${REMOTE_BUCKETS[$i]}"
        local src="${LOCAL_S3_REMOTE}:${src_bucket}"
        local dst="${REMOTE_S3_REMOTE}:${dst_bucket}"

        log_info "同步存储桶: ${src}${dst}"

        if rclone sync "${src}" "${dst}" "${RCLONE_OPTS[@]}" \
            --backup-dir "${REMOTE_S3_REMOTE}:remove/${dst_bucket}-archive-$(date +%Y%m%d)" \
            --suffix "_$(date +%Y%m%d%H%M%S)"; then
            log_info "? 存储桶 ${src_bucket} 备份成功"
        else
            log_error "? 存储桶 ${src_bucket} 备份失败"
            ((failed++))
        fi
    done

    log_info "S3 存储桶备份完成,失败数: ${failed}"
    return "${failed}"
}

# 备份本地 FTP 目录到远程 S3
backup_ftp_to_s3() {
    log_info "========== 开始备份 FTP 目录到 S3 =========="

    local src="${LOCAL_FTP_DIR}"
    local dst="${REMOTE_S3_REMOTE}:${REMOTE_FTP_BUCKET}/"

    if [ ! -d "${src}" ]; then
        log_error "本地 文档 目录不存在: ${src}"
        return 1
    fi

    log_info "同步目录: ${src}${dst}"

    if rclone sync "${src}" "${dst}" "${RCLONE_OPTS[@]}" \
        --backup-dir "${REMOTE_S3_REMOTE}:remove/${REMOTE_FTP_BUCKET}-archive-$(date +%Y%m%d)" \
        --suffix "_$(date +%Y%m%d%H%M%S)"; then
        log_info "? 文档 目录备份成功"
        return 0
    else
        log_error "? 文档 目录备份失败"
        return 1
    fi
}

# 清理过期日志(保留最近 30 天)
cleanup_old_logs() {
    log_info "清理 30 天前的日志文件..."
    find "${LOG_DIR}" -name "backup_*.log" -mtime +30 -delete 2>/dev/null || true
    log_info "日志清理完成"
}

# ======================== 主流程 ========================

main() {
    mkdir -p "${LOG_DIR}"

    log_info "=========================================="
    log_info "Rclone 热备份任务开始"
    log_info "=========================================="

    check_rclone

    local exit_code=0

    # 任务1:备份 S3 存储桶
    if ! backup_s3_buckets; then
        exit_code=1
    fi

    # 任务2:备份 FTP 目录
    if ! backup_ftp_to_s3; then
        exit_code=1
    fi

    # 清理旧日志
    cleanup_old_logs

    log_info "=========================================="
    log_info "Rclone 热备份任务结束 (退出码: ${exit_code})"
    log_info "=========================================="

    exit "${exit_code}"
}

main "$@"