Rclone是一款极为强大的命令行工具,主要用于不同云存储服务之间的文件同步、备份和迁移。它支持众多云存储提供商,如 Google Drive、OneDrive、Dropbox 等。
本文将详细介绍 Rclone 的安装与配置,展示其常用命令(如copy
、move
、sync
等)以及各种参数(如include
和exclude
等),并阐述filter
的编写方式。文中所有内容均可在 Rclone 官网找到,这里主要是进行了相关整理,为大家提供一种“快速”的参考方式。
1. 对象存储服务是什么
在使用 Rclone 之前,我们需要了解对象存储服务的概念。对象存储是一种用于存储大量非结构化数据的存储方式。Rclone 支持大部分的对象存储服务,国外的有 Google、MS、Amazon 等,国内的包括阿里云、百度云、腾讯云、火山云等。详细列表可参考这里。
在此,特别推荐赛博菩萨cloudflare和 oracle cloud。
除了公共对象存储之外,自建对象存储如 MinIO,Rclone 也是支持的。可参考这篇教程,在本地搭建一个 MinIO 的对象存储。
2. 安装 Rclone
Rclone 有多种安装方式,任选其一即可。
2.1. 包管理器直接安装
sudo dnf install rclone # RedHat
sudo apt install rclone # Ubuntu
brew install rclone # MacOS
2.2. 统一脚本安装
sudo -v ; curl https://rclone.org/install.sh | sudo bash
安装 beta 版本:
sudo -v ; curl https://rclone.org/install.sh | sudo bash -s beta
2.3. 手动下载安装包安装
curl -O https://downloads.rclone.org/rclone-current-linux-amd64.zip
unzip rclone-current-linux-amd64.zip
cd rclone-*-linux-amd64
3. 配置 Rclone
有两种配置方式,一种是使用rclone config
进行配置,另一种是直接修改~/.config/rclone/rclone.conf
文件。实际上,第一种方式最终也是修改配置文件。常见的配置文件如下:
[aoi]
type = s3
access_key_id = xxxx
secret_access_key = yyyy
endpoint = http://oss.aoi.ai
其中,access_key_id
和secret_access_key
来自云服务商,endpoint
则是地址。用户可以自行配置的部分是名称。在后续的运行中,远程地址就是aoi:xxxx
,其中xxxx
是 bucket 的名字。Rclone 的操作对象也可以全部是本地文件系统。
3.1. 配置 cloudflare 的 R2 存储
赛博菩萨 cloudflare 提供免费的对象存储。后续会专门撰写一篇文章介绍具体操作过程。
4. Rclone 命令
下面介绍 Rclone 常用的命令。
4.1. 查看 ls
lsl
lsd
lsf
lsjson
ls
:仅列出对象的大小和路径。lsl
:列出对象的修改时间、大小和路径。lsd
:仅列出目录。lsf
:以易于解析的格式列出对象和目录。lsjson
:以 JSON 格式列出对象和目录。
ls
、lsl
、lsd
这几个命令的结果是人类可读的。而lsf
的结果是人类和机器都可读的,lsjson
被设计为机器可读,从名字就可以看出其输出为 JSON 格式。ls
和lsf
默认是递归的,可以添加--max-depth 1
设定递归程度。其他的lsd
、lsf
、lsjson
默认不是递归的,添加-R
可实现递归。
Rclone 的速度非常快,在 Python 中使用subprocess
时,比 Python 中的 s3 库快很多。
4.2. 同步 sync
这是 Rclone 最重要的功能。它将源目录中的文件同步到目标目录。如果目标目录中存在与源目录相同的文件,Rclone 会根据文件的修改时间来决定是否覆盖目标文件。如果源文件比目标文件新,或者目标文件不存在,Rclone 会将源文件复制到目标目录。如果目标文件比源文件新,Rclone 会根据配置决定是否覆盖源文件。
rclone sync source: destination: [options]
例如:
rclone sync local_folder:remote_drive:backup_folder --exclude "*.tmp"
将本地文件夹local_folder
中的文件同步到远程驱动器remote_drive
下的backup_folder
中,同时排除所有以.tmp
结尾的文件。
对于这种可能具有破坏性的命令,可以添加“后悔药”--dry-run
,它只是列出将要操作的命令和受影响的文件,而不是实际执行操作。实际上,以下两个命令也很实用:
-P
--progressive。--verbose
:显示详细信息。
4.3. 复制 copy
将源目录中的文件复制到目标目录。与同步命令不同的是,复制命令不会删除目标目录中不存在于源目录中的文件。它只是单纯地将源目录中的文件复制到目标目录,如果目标目录中已经存在相同的文件,Rclone 会根据配置决定是否覆盖目标文件。
rclone copy source: destination: [options]
例如:
rclone copy remote_drive:source_folder local_folder --include "*.pdf"
这个命令将远程驱动器中的source_folder
文件夹下所有以.pdf
结尾的文件复制到本地文件夹local_folder
中。
这里需要说明一下同步和复制的区别。同步是保持两个文件夹的内容一致,而复制只是简单的拷贝。
4.4. 移动 move
rclone move source: destination: [options]
将源目录中的文件移动到目标目录。这意味着源目录中的文件将被删除,而目标目录中会出现相同的文件。如果目标目录中已经存在相同的文件,Rclone 会根据配置决定是否覆盖目标文件。
rclone move local_folder:remote_drive:archive_folder --exclude "*.log"
将本地文件夹local_folder
中的文件移动到远程驱动器remote_drive
下的archive_folder
中,同时排除所有以.log
结尾的文件。
4.5. 删除 delete
用于删除某个具体的文件,如果是地址:
rclone delete remote:path [options]
删除远程存储中的文件或目录。这个命令需要谨慎使用,因为一旦删除,文件可能无法恢复。
例如:
rclone delete remote_drive:old_folder --dry-run
这个命令会模拟删除远程驱动器中的old_folder
文件夹,但不会真正执行删除操作,只是显示如果执行删除命令会发生什么。
4.6. 清理 purge
rclone purge remote:path [options]
删除远程存储中的指定路径及其所有内容,包括子目录和文件。这个命令比delete
命令更彻底,因为它会删除整个目录结构。
例如:
rclone purge remote_drive:old_data_folder
这个命令会删除远程驱动器中的old_data_folder
文件夹及其所有内容。
4.7. 检查文件命令check
rclone check source: destination: [options]
比较源目录和目标目录中的文件,以确定它们是否相同。如果文件不同,Rclone 会报告差异。
例如:
rclone check local_folder:remote_drive:backup_folder
这个命令会检查本地文件夹local_folder
和远程驱动器中backup_folder
文件夹下的文件是否相同。
4.8. 挂载命令mount
rclone mount source: mountpoint [options]
将远程存储挂载到本地文件系统中,使得你可以像访问本地磁盘一样访问远程存储。
例如:
rclone mount remote_drive: /mnt/remote_drive --vfs-cache-mode writes
这个命令将远程驱动器挂载到本地文件系统的/mnt/remote_drive
目录下,并设置虚拟文件系统缓存模式为writes
,以提高写入性能。
4.9 查看 cat
就像查看本地文件一样使用cat
命令。
4.10. 小结
当然,这么多的命令不可能一下都记住。没关系,忘记的时候可以回来查询。
5. filtering include exclude
主要适用于下列命令sync
、move
、ls
、lsl
、md5sum
、sha1sum
、size
、delete
、check
等会改变文件的命令。pruge
命令不适用 filter。
有时候我们在进行 rclone 操作的时候需要对文件进行一系列的筛选,这个时候就可以使用 filtering。
在进行 Rclone 操作时,常常需要对文件进行筛选。这时就要用到 filter。filter 是一个比较全面的功能,实际中会退化为 include 或者 exclude。实际上,在 shell 的语法中,本身也有通配符的一些说明。需要避免同时使用 include、exclude 和 filter,因为 Rclone 在同时解析时,可能会出现未知问题。
Rclone 的匹配规则遵循 glob 风格:
* 匹配任何非分隔符(/)字符序列
** 匹配任何字符序列,包括/分隔符
? 匹配任何单个非分隔符(/)字符
[ [! ] { character-range } ]
字符类(必须非空)
{ pattern-list }
模式替代
{{ regexp }}
正则表达式匹配
c 匹配字符 c(c!= *, **,?, \, [, {, })
\c 匹配保留字符 c(c = *, **,?, \, [, {, })或字符类
character-range:
c 匹配字符 c(c!= \, -, ])
\c 匹配保留字符 c(c = \, -, ])
lo - hi 匹配字符 c,满足 lo <= c <= hi
pattern-list:
pattern {, pattern }
逗号分隔(无空格)的模式
总结
本文全面介绍了 Rclone 的各种使用方式。