rsync 仅同步文件而不在目标上创建文件夹

rsync 仅同步文件而不在目标上创建文件夹

使用 rsync 是否有可能不在目标上创建目录?

想象一下我有这个来源:

a/
a/x.txt
b/
b/y.txt

我有这个目的地:

a/
a/z.txt

想要的结果rsync source destination

a/
a/x.txt
a/z.txt

当然,我的真实情况涉及数千个文件/文件夹结构,我不希望解决方案涉及同步文件夹的明确列表,但我可以做到。我正在寻找一种干净的方法来防止在目标上创建任何文件夹。通过排除或过滤...这甚至可能是 rsync 之外的某些东西,例如如果 rsync 不能做到这一点,则对权限进行黑客攻击...


就信息而言,这种情况确实很容易发生,就我而言,我有:

  • 一台服务器有 2 个磁盘,假设是A& B。还有一个本地驱动器C
  • 我通常用来rsync同步(和合并)远程AB本地C
  • 然后有时我只想将一些C文件同步AB。 (只是新文件……而不是目标上不存在的文件夹)

答案1

请尝试以下操作:

rsync -av src:/dir/to/files/* /dest/dir

如果您有多个嵌套子目录,则需要先执行如下操作:

find /dir/to/files -type d -print

通过循环运行该目录列表并每次调用 rsync。当然,假设您在远程计算机上执行此操作,则需要通过 ssh 发出 find 并将结果存储在数组中,然后执行 rsync 循环。

答案2

我现在为 rsync 实现了这个,并将补丁提交给上游: https://lists.samba.org/archive/rsync/2015-November/030455.html

答案3

也许执行正常的 rsync,然后在第二步删除所有新创建的文件夹...听起来很危险。

为了提高此操作的安全性,您可以使用目标系统以外的其他用户:

rsync $src $specialuser@server:$destination

删除该用户远程创建的文件夹:

ssh $normalUser@destination "find $destination -type d -user $specialuser -exec rm -r {} \;"

然后将权限恢复正常:

ssh $normalUser@destination "chown -R $defaultUser:$defaultGroup $destination"

该死,这看起来很脏...这需要一些重大改进:D

答案4

我建议使用脚本在目标上创建一个 include_file 文件,将以下内容附加/*到结果的每一行:

查找 [target_dir] -type d >[target_dir]/include.file

然后,您可以使用 rsync 来--include_file=[target_dir]/include.file指定仅包含与该文件中的模式匹配的文件——这应该是您指定点下目标上的文件夹的完整列表。

如果您每次都创建一个脚本来执行此操作,则 include.file 中的列表将始终是最新的。否则,您可能决定只是偶尔刷新它们(在要 rsync 返回的每个服务器上刷新一次)。

如果我稍后有时间,我会在这里发布一个可用的 python 脚本,但这应该会给你一条良好的前进道路。

相关内容