如何仅 rsync 特定文件夹

如何仅 rsync 特定文件夹

我只想将目录中选定的文件夹 rsync 到远程服务器。

这些文件夹列在 files.txt 中

user1/
user2/

rsync --dry-run -avv --include-from '/home/files.txt' /home/ -e ssh root@server:/home

这似乎有效,但它会扫描源上的每个文件/home。这是一个小问题,因为有数百万个文件,需要几天的时间。

我尝试使用

rsync --dry-run -avv --include-from '/home/files.txt' --exclude='*' /home/ -e ssh root@server:/home

但它不起作用,因为它排除了所有内容。

答案1

我个人更喜欢使用配置文件,rsync而不是有时很长的命令行。下面是我使用 SSH 代替您执行的操作,但使用公钥身份验证:

我的配置文件如下所示(rsync.conf在服务器端):

uid = 0  # root uid
gid = 0  # root uid
use chroot = true
read only = true
hosts allow = a.b.c.d # Client IP address (SSH authentication lets the access to 
SSH server, here is extra-protection for the rsync server)
hosts deny = 0.0.0.0  # Others IP addresses are denied

[$module]
   path = /
   include /etc/*** /usr/bin/tools/***
   exclude /*** /usr/ /usr/bin/***
   filter = - .*

命令行将是(在客户端):

rsync \
   --delete \  # Delete on destination files which does not exists on source
   -avz \      # -z:compress data during transfer; -a:archive; -v:verbose
   -e "ssh -i ~$USER/.ssh/$PRIVATE_KEY" \
   ${server}::${module} ${CLIENT_SIDE_DESTINATION}

在服务器上,必须在 中添加 SSH 公钥~/.ssh/authorized_keys。此密钥将用于tagged仅通过 SSH 执行同步:

from="a.b.c.d",command="rsync --server --daemon --config rsync.conf ." ssh-dss ....

此配置将仅同步/etc//usr/bin/tools文件夹;filters指令也将阻止隐藏文件同步。棘手的部分是调整includeexclude指令,例如仅同步目标文件夹。

答案2

您指定 /home 作为源目录,这会使速度变慢。您不能为每个用户目录分配一个作业吗?

如果这不切实际,那么您可以尝试使用标志来减少比较文件的开销--size-only,该标志将根据文件大小传输文件,而忽略时间戳检查。当然,这可能会产生不良行为,具体取决于您的环境。

除此之外,rsync 的运行频率也可以改善这种情况。考虑使用同步 这将导致基于 inotify 事件发生同步

相关内容