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中的大量选项是一个痛苦来testing这个。 有大约一百万个文件和几十万个目录,这个ile build可能需要一些时间……

你想要做的事情应该可以用--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/ 

在这里,您创build一个空终止的文件列表(只有文件,而不是目录),并将其作为rsync作为其操作的源,并通知它有关-0的空终止。 这对于避免文件名中的空格等问题很有用。


从rsync手册页:

  -R, --relative 

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

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

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

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

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

它是否真的重要,它考虑每次都在做目录? 我注意到了一些来自CIFS共享的rsync备份的行为,但忽略了它,因为最糟糕的影响是日志文件中有额外的行,如果有问题需要调查,我们需要扫描这些行。 它不会(在我们的情况下)导致任何显着的额外数据传输,因为没有任何文件被触摸,除非它们本身已被修改,并且如果远程文件夹正在被采取行动的最多的是发生所有权/烫发/date不会导致重大的IO负载,所以花费很多时间。

编辑:作为忽略它们的一种替代方法,可以通过将它们通过grep -v /$进行pipe道输出来将它们过滤出来,因为日志中的目录具有尾随path分隔符,而文件不具有尾随path。 不理想,但它会消除多余的输出,直到find更好的解决scheme。

另外,看我们最近的日志来validationgrep命令,我注意到它包括所有的目录,只是那些已经有内容的内容发生了变化(和一些不是很多),在我们的例子中。 我们的rsync选项和你指定的两个区别在于我们不保留权限(没有-p / --perms ),而是使用了一个更大的--modify-window (10秒而不是1)。 可能值得尝试使用--itemize-changes选项来查看是否提供了为什么要触摸每个目录的线索。

我有同样的问题(当我运行rsync时,输出中列出了文件夹)。 逐项更改表示权限每次都在更新,我使用--no-p选项(我正在使用rsync -avz )消除了这个问题。 在你的情况下,权限并不重要,所以我希望你可以简单地使用-rltDv而不是-rlptDv

我想你想要rsync选项'–prune-empty-dirs'