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 等会改变文件的命令。purge 命令不适用 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 }
逗号分隔(无空格)的模式
6. 小结
本文全面介绍了 Rclone 的各种使用方式。