使用rsync进行复杂的包含/排除


14

我正在尝试制定rsync过滤器语法以执行复杂的包含/排除,并尝试实现以下目标:

Include /
Exclude /home
Include /home/user1/*
Include /home/user2/subdir/*

我在过滤器语法上尝试了多种变体,尽管阅读了很多手册页,但仍无法获得这种效果。Rsync过滤器似乎非常强大,我很难相信它们无法处理这种常见情况。

Answers:


17

在使用排除规则之前,您需要将所有父目录包括到所需目录中。

例如,我在备份脚本中使用以下命令:

rsync -av \ 
--filter='+ /var/' \
--filter='+ /var/backups/' \
--filter='- /var/*' \
/ \
$DEST

因此,在您的情况下,您将需要以下内容:

rsync -av \ 
--filter='+ /home/' \
--filter='+ /home/user1/' \
--filter='+ /home/user2/' \
--filter='+ /home/user2/subdir/' \
--filter='- /home/user2/*' \
--filter='- /home/*' \
/ \
$DEST

优秀。花了我一些时间。
yclian 2011年

不知何故,当我阅读时man rsync,我误解了混合包含和排除的正确顺序。我花了一个小时才弄清楚……
亚当·里奇科夫斯基

6

在命令行上:

rsync --dry-run --verbose --recursive --include=/home/user1 --exclude=/home/* / DEST

删除--dry-run以使其起作用,将“ DEST”替换为目标位置,并根据需要将用户和主机添加到源“ /”中。

从规则文件:

rsync --dry-run --verbose --recursive --filter='merge /etc/rsync/somerules.rules' / DEST

其中的内容/etc/rsync/somerules.rules可能是:

+/ /home/user1
-/ /home/*

您应该对它们进行测试,并且可能需要进行一些调整,但这应该可以帮助您入门。


好的,行得通。我有一个更复杂的案例,已添加到问题中。附加include不适用于subdir方案。
brianmathis
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.