rsync 的 include 與 exclude 用法

rsync 除了直接同步兩端的所有檔案以外,還有一個非常實用的功能就是 include(包含)與 exclude(排除)。include 可以讓我們只同步特定的檔案,exclude 則是讓我們排除不要同步的檔案。

如果我們要指定或排除的檔案只有一、兩個,那也許直接加在 rsync 指令中就好了,但如果有四、五個以上或是更多的時候,我們可以把指定的檔案寫成一個 list 檔,在 rsync 同步時引用這份清單進行 include 或 exclude 的動作

環境說明

系統:Ubuntu 20.04.1

rsync 版本:3.1.3

範例的 source 資料夾內容如下:

source/
├── a
│   ├── a1
│   └── a2
├── b
│   ├── b1
│   └── b2
└── c
    ├── c1
    └── c2

3 directories, 6 files

source 資料夾中有 a、b、c,三個子目錄,子目錄中各有兩個檔案

include from file 的用法

目的:只同步 source 中的 a1、a2 與 c2

首先把我們要 include 的檔案做成清單,清單檔名為 includeList(檔名可自取)

檔案內容如下:

a/a1
a/a2
c/c2

includeList 裡面檔案及路徑的格式,必須是以 source 端本身的相對路徑來列舉,不能使用絕對路徑,這是 include 與 exclude list 最重要的部分。

例如我要同步 /home/source 底下的 a 與 b,list file 裡就只要寫 a、b 就好了,不要寫 /home/source/a 與 /home/source/b

接下來測試看看同步是否成功

rsync -avrP --files-from=includeList source/ backup/ --dry-run
  • --file-from=FILE:只同步 FILE 裡面列舉的檔案,雖然 rsync 有 --include-from= 的參數,而且看起來就像是我們要的功能,但幾番測試後發現 --file-from= 才是讀取同步列表!--include-from= 的功用暫時不得而知。
  • --dry-run:只顯示模擬同步後的結果,不會真的執行同步
# 執行結果

building file list ...
5 files to consider
a/
a/a1
a/a2
c/
c/c2

sent 149 bytes  received 31 bytes  360.00 bytes/sec
total size is 0  speedup is 0.00 (DRY RUN)

果然只有同步 a1、a2 及 c2,如果沒問題的話,把 --dry-run 去掉再執行一次 rsync 就完成了!

exclude from file 的用法

目的:同步時排除 a1、b1、c1,也就是這三個檔案以外的內容都要同步

一樣把我們要 exclude 的檔案做成清單,清單檔名為 excludeList

檔案內容如下:

a/a1
b/b1
c/c1

再次提醒,list 的檔案路徑寫法必須是 source 資料夾的相對路徑!

接著測試同步

rsync -avP --exclude-from=excludeList source/ backup/ --dry-run
  • --exclude-from=File:同步時排除 FILE 裡面的內容(這次的參數就比較顧名思義了)
# 執行結果

sending incremental file list
./
a/
a/a2
b/
b/b2
c/
c/c2

sent 205 bytes  received 40 bytes  490.00 bytes/sec
total size is 0  speedup is 0.00 (DRY RUN)

a1、b1、c1 都被排除掉啦

如果寫成絕對路徑…?

前面都一直強調要用 source 的相對路徑來列清單,那如果我們用絕對路徑來寫 includeList,內容如下:

/tmp/source/a/a1
/tmp/source/a/a2
/tmp/source/c/c2

接著執行 rsync 並讀取這份寫著絕對路徑的清單

rsync -avP --files-from=includeList /tmp/source/ /tmp/backup/ --dry-run
# 執行結果:

building file list ...
rsync: link_stat "/tmp/source/tmp/source/a/a1" failed: No such file or directory (2)
rsync: link_stat "/tmp/source/tmp/source/a/a2" failed: No such file or directory (2)
rsync: link_stat "/tmp/source/tmp/source/c/c2" failed: No such file or directory (2)
0 files to consider

sent 18 bytes  received 12 bytes  60.00 bytes/sec
total size is 0  speedup is 0.00 (DRY RUN)
rsync error: some files/attrs were not transferred (see previous errors) (code 23) at main.c(1207) [sender=3.1.3]

可以看到 rsync 找不到清單裡面的檔案,原因是前綴的完整路徑 rsync 會先幫我們帶上,從這邊就可以判斷出 list file 必須使用相對路徑了。

acidjazz Written by: