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