RSYNC 到 Windows CIFS 在更新时复制所有目录(但不复制旧内容)

RSYNC 到 Windows CIFS 在更新时复制所有目录(但不复制旧内容)

我已经安装了一个远程 Windows 共享(我的磁带备份将存档在那里)。

我有 70GB 的数据,而且变化不大,所以我想使用 RSYNC 来镜像数据。

/usr/bin/rsync -rlptDv -e ssh --delete \
      --exclude "*Locks" --exclude "tmp" --bwlimit=0 \
      --modify-window=1 /cvs1/* localhost:/mnt/DUBBU01/Linux/Buzz/cvs1/

现在一切正常,因为没有文件被更新。老实说,文件夹权限的设置太糟糕了,因为如果我必须从备份中恢复,这些权限可能会被重置。

但是每个文件夹都会被复制。不是其内容,只是文件夹。有没有办法排除包含数据的文件夹,但不排除数据本身?

rsync 中的大量选项使得测试变得非常麻烦。由于有大约一百万个文件和几十万个目录,ile 构建可能需要一些时间......

答案1

您想要做的事情应该可以通过--relative(或-R)选项以及之前运行的find生成文件列表来实现:

find /cvs1 -type f -not \( -name *Locks -o -name tmp \) -print0 > filelist
rsync -pR --modify-window=1 -0 \
      --files-from=filelist /mnt/DUBBU01/Linux/Buzz/

在这里,您可以创建一个以空字符结尾的文件列表(仅限文件,不包括目录),并将其作为 rsync 操作的源,并使用 通知它有关空字符结尾的信息-0。这有助于避免文件名中出现空格等问题。


来自 rsync 手册页:

   -R, --relative

使用相对路径。这意味着命令行上指定的完整路径名会被发送到服务器,而不仅仅是文件名的最后部分。当您想同时发送几个不同的目录时,这特别有用。例如,如果您使用此命令:

rsync -av /foo/bar/baz.c remote:/tmp/

...这将在远程机器上创建一个名为的文件baz.c/tmp/如果你使用

rsync -avR /foo/bar/baz.c remote:/tmp/

/tmp/foo/bar/baz.c 那么将在远程机器上创建一个名为的文件 ——完整路径名被保留。

答案2

它每次都考虑对目录进行某些操作,这真的很重要吗?我注意到我们的一些 rsync 备份来自 CIFS 共享,但忽略了它,因为它造成的最坏影响是日志文件中多了一些行,如果有问题需要调查,我们需要扫描这些行。它(在我们的例子中)不会导致任何明显的额外数据传输,因为除非文件本身被修改,否则不会触及任何文件,如果远程文件夹正在被操作,那么最多发生的是设置所有权/权限/日期,这不会导致重大的 IO 负载,因此需要花费很多时间。

编辑:除了忽略它们之外,您还可以通过管道将它们从输出中过滤掉grep -v /$,因为日志中的目录有尾随路径分隔符,而文件没有。这不是最理想的,但它会将多余的输出从视线中移除,直到您找到更好的解决方案。

另外,查看我们最近的日志以验证 grep 命令,我注意到它不是包括全部目录,在我们的例子中,只是那些其中的内容发生变化的目录(以及一些没有变化但不是很多的目录)。我们的 rsync 选项与您指定的选项之间的两个区别是,我们没有保留权限(没有-p/ --perms)并且使用了更大的时间--modify-window(10 秒而不是 1 秒)。可能值得尝试该--itemize-changes选项,看看它是否提供了有关为什么它想要触及每个目录的线索。

答案3

我遇到了同样的问题(运行 时,文件夹列在输出中rsync)。逐项更改表明权限每次都在更新,我使用选项--no-p(我使用的是rsync -avz)消除了这个问题。对于您来说,权限并不重要,所以我希望您可以简单地使用-rltDv而不是-rlptDv

答案4

我认为你需要 rsync 选项 '--prune-empty-dirs'

相关内容