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 的各種使用方式。