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

Tam*_* J. 3 ubuntu rsync

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

一个小例子:运行命令时

rsync -a --delete-delay --progress --itemize-changes --stats --dry-run --log-file="/tmp/rsync-dry.txt" /tmp/mySource/ /tmp/myDest/
Run Code Online (Sandbox Code Playgroud)

日志文件看起来像这样(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
...
Run Code Online (Sandbox Code Playgroud)

没有试运行,即

rsync -a --delete-delay --progress --itemize-changes --stats --log-file="/tmp/rsync-wet.txt" /tmp/mySource/ /tmp/myDest/
Run Code Online (Sandbox Code Playgroud)

日志文件如下所示(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
...
Run Code Online (Sandbox Code Playgroud)

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

我很困惑,因为我认为带和不带 --dry-run 的 rsync 的输出应该是一样的。(否则,dry-run 有什么好处?)该问题仅涉及日志文件。不管有没有 --dry-run 终端输出总是完整的。

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

Tam*_* J. 6

最后,我发现一个提示,上面描述的 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
Run Code Online (Sandbox Code Playgroud)

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