Rsync

rsync 子路徑的過濾文件規則

  • August 6, 2012

我在理解子路徑的 rsync 過濾器規則時遇到了一個大問題。我有這個目錄樹:

|-- index.php
|-- other-file-php.php
|-- filesource.php
|   |-- album1
|   |   |-- firstphoto.jpg
|   |   |-- second.jpg
|   |   |-- index.php
|   |   `-- thumbs
|   |       |-- _map.txt
|   |       |-- _title_ciao.jpg.txt
|   |       |-- _120_second.jpg
|   |       |-- _dir_album1.jpg
|   |       `-- _300_second.jpg
|   |-- altre
|   |   |-- img_1172.jpg
|   |   |-- album2
|   |   |   |-- index.php
|   |   |   `-- thumbs
|   |   |       |-- _title_img_1172.jpg.txt
|   |   |       |-- _dir_album2.jpg
|   |   |       `-- _guestbook.html

我只能使用 rsync 的 -f -filter 選項,因為我必須將所有規則寫入一個文件。在此樹中,有不同類型的文件可以位於樹的任何級別。我想要:

  1. 有目錄結構的完整備份
  2. 備份所有類型的文件.php, .txt,.html
  3. 以開頭的備份.jpg文件_
  4. .jpg開頭的備份文件_dir

為了解決您的觀點:

  1. 這只是意味著您指定的所有排除規則都必須是文件,而不是目錄。由於 rsync 不區分類型,因此您必須小心您的規則(和文件命名約定)。
  2. 採用:
+ **/*.php
+ **/*.txt
+ **/*.html
  1. 採用:
+ **/*.jpg
- **/_*.jpg
  1. 我不明白你的意思。

將以下行放入filter.txt

+ */
+ *.php
+ *.txt
+ *.html
+ **/_dir*.jpg
- **/_*.jpg
+ *.jpg
- *

然後rsync像這樣執行:

rsync -a --include-from=filter.txt /path/to/source/ /path/to/dest

解釋filter.txt

首先,請注意過濾規則的順序非常重要,因為rsync按順序評估它們並應用第一個匹配的規則

預設情況下,rsync包含所有未明確排除的文件,因此最終規則filter.txt是排除前面規則未明確包含的所有文件。第一條規則包括所有目錄(如尾隨所示/),它應該照顧您的 #1 條件。規則 2 到 4 分別處理 php、txt 和 html 文件,而規則 5 到 7 允許所有以 . 開頭_dir或不以. 開頭的 jpg 文件_

(規則 5 和 6 具有**前綴,以便將萬用字元規則錨定到任何目錄深度的文件名部分的開頭。沒有**前綴,這些規則將僅匹配頂級源目錄。)

最後說明:如果您(由於某種原因)無法使用--include-from,那麼您應該能夠將過濾規則指定為-f命令行上的一系列選項。

編輯

要使用filter.txtin rsnapshot,可以rsnapshot.conf通過include_file參數 in 指定,如下:

include_file /path/to/filter.txt

編輯#2

如果您需要為每個備份使用一組不同的過濾器,您可以include_file為 中的每一backup行使用不同的過濾器rsnapshot.conf,例如:

...
backup /path/to/src1/ dest1/ include_file=/path/to/src1_filter.txt
backup /path/to/src2/ dest2/ include_file=/path/to/src2_filter.txt
...

引用自:https://serverfault.com/questions/414358