Rclone基础教程
Rclone是一个用于管理云存储文件的命令行程序。它是云存储供应商网页存储界面的一个功能丰富的替代方案。超过70种云存储产品支持rclone,包括S3对象存储、企业和个人文件存储服务,以及标准传输协议。
Rclone拥有与Unix命令rsync、cp、mv、mount、ls、ncdu、tree、rm和cat相对应的强大云命令。Rclone熟悉的语法支持shell管道,并且有--dry-run保护机制。它可以在命令行中使用,也可以在脚本中使用,还可以通过其API使用。
人称rclone:云存储的瑞士军刀
官网
rclone中文站
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 # 传输完成校验文件哈希
常见组合速查清单
- 测试同步逻辑:
rclone sync A B --dry-run - 日常安全备份:
rclone copy A B --progress - 镜像备份:
rclone sync A B --progress - 挂载网盘:
rclone mount remote:/ /mnt/path --vfs-cache-mode writes - 清理垃圾目录:
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 "$@"