Rsync
rsync 子路徑的過濾文件規則
我在理解子路徑的 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 選項,因為我必須將所有規則寫入一個文件。在此樹中,有不同類型的文件可以位於樹的任何級別。我想要:
- 有目錄結構的完整備份
- 備份所有類型的文件
.php
,.txt
,.html
- 不以開頭的備份
.jpg
文件_
.jpg
開頭的備份文件_dir
為了解決您的觀點:
- 這只是意味著您指定的所有排除規則都必須是文件,而不是目錄。由於 rsync 不區分類型,因此您必須小心您的規則(和文件命名約定)。
- 採用:
+ **/*.php + **/*.txt + **/*.html
- 採用:
+ **/*.jpg - **/_*.jpg
- 我不明白你的意思。
將以下行放入
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.txt
inrsnapshot
,可以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 ...