获取 rsync 以报告是否有任何本地文件更新

Fid*_*del 6 rsync exit-status

我正在运行 rsync 来从远程主机拉到本地主机。

rsync -a --update user@remotehost:/files/ ~/files/
Run Code Online (Sandbox Code Playgroud)

我正在从 java 运行该命令并使用退出代码来确定它是否成功。

如果修改了任何本地文件,是否可以让该命令报告?通过退出代码返回报告将是理想的。

Rob*_*rtL 5

您无法rsync通过退出代码告诉您。退出代码已记录了预定义的含义。

我认为从 Java 执行此操作的最佳方法是添加--info=NAME仅提及更新的目录和文件名的选项:

rsync -a --info=NAME --update user@remotehost/files/ ~/files/
Run Code Online (Sandbox Code Playgroud)

这会在标准输出 (fd = 0) 上打印更新文件和目录的名称,每行一个。

然后,您将从中收集输出rsync并计算字符串中的换行数。

我认为java在这个答案中可以找到收集输出的好方法,但我还没有尝试过:https : //stackoverflow.com/a/9048519/5484716

千万不能使用redirectErrorStream或以任何其他方式合并标准输出的标准错误流。如果这样做,您会将错误消息计为更新的文件,而不是您想要的。


Dav*_*ing 1

标志--infoonrsync将输出传输的任何文件的路径。的退出代码rsync指示成功/失败,因此如果不将脚本包装在命令周围,您将无法使用它,例如

#!/bin/bash

files=$(rsync -a --info=NAME --update user@remotehost/files/ ~/files/)

if [ $files = "" ]; then
  # files weren't transferred
  exit 0
else
  # files were transferred
  exit 1
fi
Run Code Online (Sandbox Code Playgroud)

然后从 java 调用该脚本而不是rsync直接调用命令。 rsync可能会在传输的开头和结尾输出一些其他文本行,因此您可能需要调整语句if以考虑额外的输出行,但基本想法是可行的。