子路径的 rsync 过滤文件规则

ste*_*cud 3 rsync rsnapshot

我在理解子路径的 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
Run Code Online (Sandbox Code Playgroud)

我只能使用 rsync 的 -f -filter 选项,因为我必须将所有规则写入一个文件。在这棵树中,有不同类型的文件可以位于树的任何级别。我想要:

  1. 有目录结构的完整备份
  2. 备份所有类型的文件.php, .txt,.html
  3. 不以开头的备份.jpg文件_
  4. .jpg以开头的备份文件_dir

Ste*_*day 5

将以下行放入filter.txt

+ */
+ *.php
+ *.txt
+ *.html
+ **/_dir*.jpg
- **/_*.jpg
+ *.jpg
- *
Run Code Online (Sandbox Code Playgroud)

然后rsync像这样运行:

rsync -a --include-from=filter.txt /path/to/source/ /path/to/dest
Run Code Online (Sandbox Code Playgroud)

的解释filter.txt

首先,请注意过滤规则的排序非常重要,因为rsync按顺序评估它们并应用匹配的第一个规则

默认情况下,rsync包括所有未明确排除的文件,因此最终规则filter.txt是排除前面规则未明确包括的所有内容。第一条规则包括所有目录(如尾随 所示/),它应该处理您的 #1 条件。规则 2 到 4 分别处理 php、txt 和 html 文件,而规则 5 到 7 允许所有_dir_.

(规则 5 和 6 具有**前缀,以便将通配符规则锚定到任何目录深度的文件名部分的开头。如果没有**前缀,这些规则将仅在顶级源目录中匹配。)

最后说明:如果您无法(由于某种原因)使用--include-from,那么您应该能够-f在命令行上将过滤规则指定为一系列选项。

编辑

要使用filter.txtin rsnapshot,您可以rsnapshot.conf通过include_file参数指定 in ,如下所示:

include_file /path/to/filter.txt
Run Code Online (Sandbox Code Playgroud)

编辑#2

如果您需要为每个备份使用一组不同的过滤器,您可以include_filebackup您的 中的每一行使用不同的过滤器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
...
Run Code Online (Sandbox Code Playgroud)