Rclone使用教程

安装和配置Rclone,用Rclone命令实现S3上文件的管理 Modified: 2024-09-30 15:53:20 Created: 2024-09-28 15:53:19 Tags: #rclone #s3 #oss

Rclone是一款极为强大的命令行工具,主要用于不同云存储服务之间的文件同步、备份和迁移。它支持众多云存储提供商,如 Google Drive、OneDrive、Dropbox 等。

本文将详细介绍 Rclone 的安装与配置,展示其常用命令(如copymovesync等)以及各种参数(如includeexclude等),并阐述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_idsecret_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 格式列出对象和目录。

lslsllsd这几个命令的结果是人类可读的。而lsf的结果是人类和机器都可读的,lsjson被设计为机器可读,从名字就可以看出其输出为 JSON 格式。lslsf默认是递归的,可以添加--max-depth 1设定递归程度。其他的lsdlsflsjson默认不是递归的,添加-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

主要适用于下列命令syncmovelslslmd5sumsha1sumsizedeletecheck等会改变文件的命令。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 的各种使用方式。