我已经安装了一个远程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'