![为什么 rsync 日志文件在空运行时不包含对常规文件的更新?](https://linux22.com/image/71816/%E4%B8%BA%E4%BB%80%E4%B9%88%20rsync%20%E6%97%A5%E5%BF%97%E6%96%87%E4%BB%B6%E5%9C%A8%E7%A9%BA%E8%BF%90%E8%A1%8C%E6%97%B6%E4%B8%8D%E5%8C%85%E5%90%AB%E5%AF%B9%E5%B8%B8%E8%A7%84%E6%96%87%E4%BB%B6%E7%9A%84%E6%9B%B4%E6%96%B0%EF%BC%9F.png)
在干运行模式下,日志文件不包含更改/更新的常规文件,并且根本不包含任何删除。它只包含更改和创建的目录。然而,当在没有试运行的情况下执行时,日志文件确实包含各种更改。
一个小例子:运行命令时
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
。