繁体   English   中英

使用Rsync过滤器来包含/排除文件

[英]Using Rsync filter to include/exclude files

我正在尝试备份一个文件系统,排除/mnt但在/mnt包含一个特定的路径,看起来好像使用--filter建议使用--include和--exclude,但我似乎无法获得它来做我的出价,例如:

rsync -aA -H --numeric-ids -v --progress --delete \
  --filter="merge /tmp/mergefilter.txt" /  /mnt/data/mybackup/

我的/tmp/mergefilter.txt说:

+ /mnt/data/i-want-to-rsyncthisdirectory/
- /dev
- /sys/
- /tmp/
- /run/
- /mnt/
- /proc/
- /media/
- /var/swap
- /lost+found/

所有以“ - ”开头的路径都会被忽略,但是我的/mnt/data/i-want-to-rsyncthisdirectory/似乎永远不会得到rsync 顺序和/或包含/排除尾部斜杠似乎不会改变与我想要包含的路径相关的行为。

编辑:请注意,我确实要根据指定为/的源备份/ etc / usr / var等

感谢任何指导,因为手册页有点像雷区......

对我来说,这个命令正在完成这项工作:

rsync -aA -H --numeric-ids -v --progress --delete \
--filter="+ /mnt/data/i-want-to-rsyncthisdirectory/" \
--filter="- *" . /mnt/data/mybackup/

基本上,我使用了一个+过滤器来讨论所讨论的目录并驱逐所有其他目录(正如你在给定的例子中所做的那样)。

无需明确否定您不想同步的所有目录。 相反,您可以忽略所有问题之外的所有问题。

这个问题很老了,但我认为这可能会对你有所帮助:

(来自rsync 3.1.2手册)

注意,当使用--recursive(-r)选项(由-a暗示)时,从上到下访问每个路径的每个子组件,因此包含/排除模式以递归方式应用于每个子组件的全名(例如,要包含“/ foo / bar / baz”,不得排除子组件“/ foo”和“/ foo / bar”。 当rsync找到要发送的文件时,排除模式实际上会使目录流量阶段短路。 如果模式排除特定的父目录,则它可以呈现更深层的包含模式无效,因为rsync没有通过层次结构的排除部分下降。 使用尾随'*'规则时,这一点尤为重要。 例如,这不起作用:

  + /some/path/this-file-will-not-be-found + /file-is-included - * 

这失败是因为父目录“some”被'*'规则排除,因此rsync从不访问“some”或“some / path”目录中的任何文件。 一种解决方案是通过使用单个规则要求包含层次结构中的所有目录:“+ * /”(将其放在“ - *”规则之前的某处),并且可能使用--prune-empty-dirs选项。 另一种解决方案是为需要访问的所有父目录添加特定的包含规则。 例如,这套规则运行正常:

  + /some/ + /some/path/ + /some/path/this-file-is-found + /file-also-included - * 

我在原来的答案中提出了一些没有错的东西(我测试了它)。 我重现了一个类似于你的树,这个解决方案现在应该可以工作:

 + /mnt/ + /mnt/data/ + /mnt/data/i-want-to-rsyncthisdirectory/ - /mnt/data/* - /mnt/* - /dev - /sys/ - /tmp/ - /run/ - /proc/ - /media/ - /var/swap - /lost+found/ 

说明:

(最后只重写手册,但正如你所说,手册有点神秘)

每次必须通过rsync传输文件时,都会从上到下读取规则。 但是在你的情况下/ mnt / data / i-want-to-rsyncthisdirectory /没有备份,因为你排除/ mnt并且这会使你的包含规则短路。 因此,解决方案是将每个文件夹和子文件夹包括在要备份的文件夹中,然后排除您不希望通过子文件夹备份子文件夹的内容。

请注意每个子文件夹排除结束时的* 这将阻止rsync备份位于这些子文件夹中的文件和文件夹,这是您想要的。

更简单的解决方案:(编辑2)

您甚至可以使用2.6.7版中添加的***模式简化此操作:

 + /mnt/ + /mnt/data/ + /mnt/data/i-want-to-rsyncthisdirectory/*** - /mnt/** 

此运算符允许您使用**通配符进行排除,因此只有一个排除行。

我还发现,由于以下rsync参数,您可以了解哪些过滤规则排除/包含每个文件或文件夹:

 --verbose --verbose 

结合--dry-run参数你应该能够调试你的问题:)

如果其他人像我一样正在与此作斗争,我已设法让以下工作。 在我的情况下,我有选择地从另一台服务器同步存储库。

将过滤器放在文件中:

+ epel/
+ epel/7/
+ epel/7/x86_64/
+ epel/7/x86_64/Packages**
+ epel/7/x86_64/repodata**
- **

然后可以按预期同步所有内容:

cd /srv/repo
rsync -rvzP -f 'merge /home/user/sync-filter.txt' ./ user@remote:/srv/repo/

最初,我使用epel/7/x86_64/Packages/**设置了我的过滤器文件,由于**之前的斜杠,它无法工作。 卸下/使这一切成为春季以生命为目的!

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM