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

bri*_*his 15 rsync

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

Include /
Exclude /home
Include /home/user1/*
Include /home/user2/subdir/*
Run Code Online (Sandbox Code Playgroud)

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

Sha*_*ers 18

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

例如,我在备份脚本中使用以下内容:

rsync -av \ 
--filter='+ /var/' \
--filter='+ /var/backups/' \
--filter='- /var/*' \
/ \
$DEST
Run Code Online (Sandbox Code Playgroud)

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

rsync -av \ 
--filter='+ /home/' \
--filter='+ /home/user1/' \
--filter='+ /home/user2/' \
--filter='+ /home/user2/subdir/' \
--filter='- /home/user2/*' \
--filter='- /home/*' \
/ \
$DEST
Run Code Online (Sandbox Code Playgroud)


Den*_*son 6

在命令行上:

rsync --dry-run --verbose --recursive --include=/home/user1 --exclude=/home/* / DEST
Run Code Online (Sandbox Code Playgroud)

删除--dry-run以使其正常工作,将“DEST”替换为您的目的地,并在需要时将用户和主机添加到源“/”。

从规则文件:

rsync --dry-run --verbose --recursive --filter='merge /etc/rsync/somerules.rules' / DEST
Run Code Online (Sandbox Code Playgroud)

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

+/ /home/user1
-/ /home/*
Run Code Online (Sandbox Code Playgroud)

您应该测试这些,您可能需要进行一些调整,但这应该会让您开始。