我在理解子路径的 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
答案1
针对你的观点:
- 这只是意味着您指定的所有排除规则必须是文件,而不是目录。由于 rsync 不区分类型,因此您必须小心制定规则(以及文件命名约定)。
使用:
+ **/*.php + **/*.txt + **/*.html
使用:
+ **/*.jpg - **/_*.jpg
我不知道你的意思。
答案2
将以下几行放入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
要在 中使用,您可以通过参数rsnapshot
指定它,如下所示:rsnapshot.conf
include_file
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
...
答案3
对您来说最好的方法是使用选项来制作文件:--files-from
使用 find 命令,如下所示:
cd dirtobackup;find . |egrep '\.php$|\.txt$|\.html$|^[^_].*\.jpg$|^_dir.*\.jpg$' >/tmp/files_tobackup
rsync --files-from=/tmp/files_tobackup dirtubackup dst