为什么 rsync 日志文件在空运行时不包含对常规文件的更新?

为什么 rsync 日志文件在空运行时不包含对常规文件的更新?

在干运行模式下,日志文件不包含更改/更新的常规文件,并且根本不包含任何删除。它只包含更改和创建的目录。然而,当在没有试运行的情况下执行时,日志文件确实包含各种更改。

一个小例子:运行命令时

rsync -a --delete-delay --progress --itemize-changes --stats --dry-run --log-file="/tmp/rsync-dry.txt" /tmp/mySource/ /tmp/myDest/

日志文件如下所示(3 个项目,所有项目都与目录相关):

2015/08/26 17:18:04 [5812] building file list
2015/08/26 17:18:04 [5812] .d..t...... ./
2015/08/26 17:18:04 [5812] .d..t...... sub1/
2015/08/26 17:18:04 [5812] cd+++++++++ sub2/
2015/08/26 17:18:04 [5812] Number of files: 11 (reg: 8, dir: 3)
2015/08/26 17:18:04 [5812] Number of created files: 5 (reg: 4, dir: 1)
2015/08/26 17:18:04 [5812] Number of deleted files: 4 (reg: 3, dir: 1)
2015/08/26 17:18:04 [5812] Number of regular files transferred: 6
...

没有空运行,即

rsync -a --delete-delay --progress --itemize-changes --stats --log-file="/tmp/rsync-wet.txt" /tmp/mySource/ /tmp/myDest/

日志文件如下所示(13 项):

2015/08/26 17:19:44 [5837] building file list
2015/08/26 17:19:44 [5837] .d..t...... ./
2015/08/26 17:19:44 [5837] >f.st...... Bbb.txt
2015/08/26 17:19:44 [5837] >f+++++++++ Ccc.txt
2015/08/26 17:19:44 [5837] .d..t...... sub1/
2015/08/26 17:19:44 [5837] >f.st...... sub1/Fff.txt
2015/08/26 17:19:44 [5837] >f+++++++++ sub1/Ggg.txt
2015/08/26 17:19:44 [5837] cd+++++++++ sub2/
2015/08/26 17:19:44 [5837] >f+++++++++ sub2/Iii.txt
2015/08/26 17:19:44 [5837] >f+++++++++ sub2/Jjj.txt
2015/08/26 17:19:44 [5837] *deleting   sub3/Kkk.txt
2015/08/26 17:19:44 [5837] *deleting   sub3/
2015/08/26 17:19:44 [5837] *deleting   Ddd.txt
2015/08/26 17:19:44 [5837] *deleting   sub1/Hhh.txt
2015/08/26 17:19:44 [5837] Number of files: 11 (reg: 8, dir: 3)
2015/08/26 17:19:44 [5837] Number of created files: 5 (reg: 4, dir: 1)
2015/08/26 17:19:44 [5837] Number of deleted files: 4 (reg: 3, dir: 1)
2015/08/26 17:19:44 [5837] Number of regular files transferred: 6
...

它准确地反映了 rsync 正在做什么。

我很困惑,因为我相信有和没有 --dry-run 的 rsync 的输出应该是相同的。 (否则,空运行有什么用?)问题仅涉及日志文件。无论有没有 --dry-run,终端输出始终是完整的。

我尝试了不同的选项,例如 --rtgopl 或 -rtgo 代替 -a,-v 代替 -i。我尝试重新排列标志。我尝试添加 -c 或 --inplace 等选项。没有帮助。目的地是另一个本地路径(如示例中所示)、USB 驱动器还是通过 ssh 的远程目的地也并不重要。我做错了什么?或者 rsync 应该像这样工作吗? (我使用的是 Ubuntu 14.04,rsync 版本 3.1.0。)

答案1

最后,我发现了一个提示,即上述 rsync 的行为可能是一个功能,而不是一个错误:

当前代码对 --log-file 的记录方式与对守护程序日志的记录方式相同,这意味着它不会记录并非真正传输的传输。

[https://bugzilla.samba.org/show_bug.cgi?id=5792#c2]

为了在干运行模式下获得真正包含的日志文件全部更新、创建和删除,作为一种解决方法,您可以将屏幕输出重定向到文件,例如

rsync -a --delete-delay --progress --itemize-changes --stats --out-format='%t %p %i %n %M %l' --dry-run /tmp/mySource/ /tmp/myDest/  | tee /tmp/rsync-dry.txt

在示例中,我使用该选项--out-format='%t %p %i %n %M %l'大致按照该选项格式化输出的方式来格式化输出--log-file

相关内容