我想rsync
将“copy_to_home”目录(位于 NTFS 格式的硬盘驱动器上)中的所有内容复制到用户主目录。我不希望它删除任何内容,但如果接收端的文件与发送端的文件不同,它应该替换接收端的文件。
该命令如下所示:
rsync --modify-window=1 -hh --progress -v -r copy_to_home/ ~/
我的问题是,每当执行此命令时,rsync 似乎总是替换其中的每个文件,~
尽管文件尚未更改。该--update
选项不会执行此操作,但它不会替换接收方已修改的文件。
答案1
如果 Quora Feans 的回答没有帮助,您可以添加选项-i
或--itemize-changes
获取 rsync 来解释它更新文件的原因。它打印一个由字符组成的字符串,YXcstpoguax
例如c
,表示校验和不同。您可能会发现代码p
权限不同或o
所有者不同。这些通常通过使用-a
保留此类属性的选项来修复。如果您仍然看到差异,请尝试--size-only
仅在文件大小不同时更新文件(忽略时间戳)。
答案2
每当涉及 Windows 格式的文件系统时,匹配时间戳的可靠性较差,可能会导致文件不断被误解为不同,因此 rsync 最终会复制所有内容。当涉及到 Windows 格式的文件系统时,针对这种较差的时间戳可靠性的一种解决方法是根本不比较时间戳,而是比较内容。 Rsync 有该-c
选项,因此在命令提示符下您可以尝试:
$ rsync -c --progress -v -r copy_to_home/ ~/
解释
- 如果没有
-c
或--checksum
,rsync 通常通过比较文件大小和修改时间来确定是否更新项目,正如您所看到的,当涉及来自 Windows NTFS 的文件和目录时,尽管尝试将其获取到,但它并不那么可靠。工作得更好,就像你所做的那样--modify-window=1
- 如果我们在比较大小时仅省略时间戳比较,则仍然可能存在更改前后具有相同文件大小的文件,因此如果 rsync 仅比较文件大小,则会丢失
- 指定
-c
使 rsync 对源文件和目标文件运行校验和以进行比较和决定。因此,通过这种方式,通过校验和,rsync 根据文件的实际内容而不是修改时间或大小来决定是否传输文件,从而确保不会丢失任何内容或不必要的复制
缺点
- 文件越大,运行速度越慢,因此如果你使用 rsync 处理千兆字节大小的文件,速度当然会很慢。不过,如果这是你目前的情况,那么与 rsync 不必要地复制千兆字节大小的文件相比,这将是一个改进
- 否则,如果您的主目录中通常只有想要 rsync 的小型文本配置文件,那么对于现代计算机,使用校验和的延迟甚至可能不明显
- 或者,如果您确实有千兆字节大小的文件并且此过程很慢,则使用 cron 安排命令在非高峰时间运行
答案3
您需要的是归档文件。也就是-a
选项。试运行如下:
sudo rsync -avr --dry-run --delete <sourcedir/> <targetdir>
而且,说实话:
sudo rsync -avr --delete <sourcedir/> <targetdir>
请注意/
sourcedir 末尾的 。