取得 rsync 來報告是否更新了任何本機文件

取得 rsync 來報告是否更新了任何本機文件

我正在運行 rsync 以從遠端主機拉取到本機。

rsync -a --update user@remotehost:/files/ ~/files/

我正在從 java 運行該命令並使用退出代碼來確定它是否成功。

如果有任何本機檔案被修改,是否可以讓該指令回報回來?透過退出代碼進行報告是理想的選擇。

答案1

您無法rsync透過退出代碼告訴您這一點。退出代碼已記錄預定義含義。

我認為從 java 執行此操作的最佳方法是添加--info=NAME僅提及更新的目錄和檔案名稱的選項:

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

這會在標準輸出 (fd = 0) 上列印更新的檔案和目錄的名稱,每行一個。

然後,您將收集輸出rsync並計算字串中換行符的數量。

我認為可以在這個答案中找到收集輸出的好方法java,但我還沒有嘗試過:https://stackoverflow.com/a/9048519/5484716

不是使用redirectErrorStream或以任何其他方式合併標準輸出和標準錯誤流。如果這樣做,您將把錯誤訊息算作更新的文件,而不是您想要的文件。

答案2

基於@DavidKing 讓rsync 列印複製的檔案名稱的想法,並使用@yashma 的資訊進行擴展,即當stdin 為空時grep 將退出非零退出狀態,我們可以想出這個令人滿意的簡短而神秘的單行:

# prints file list, exits nonzero when that list is empty
rsync -a --info=NAME --update user@remotehost:/files/ ~/files/ | grep .

答案3

標誌--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

然後從 java 呼叫該腳本而不是rsync直接呼叫命令。 rsync可能會在傳輸的開頭和結尾輸出一些其他文字行,因此您可能需要調整語句if以考慮額外的輸出行,但基本想法是可行的。

答案4

透過傳回碼來獲取資訊的方法是編寫一個 shell 腳本,rsync從 java 呼叫並執行 shell 腳本。正如我在下面概述的那樣,這存在一些主要問題。 shell 腳本可能如下圖所示:

#!/bin/sh
if OUTPUT=$(rsync -a --info=NAME --update user@remotehost/files/ ~/files/)
then
    if [ "$OUTPUT" != "" ]                   # got output?
    then
        exit 0  # yes, success, "some" files were updated
    fi
fi
exit 1  # either rsync failed or no files were updated

這樣做的主要問題是您將無法判斷同步過程本身是否成功完成。您只知道文件是否更新。這就是為什麼我建議用 java 收集輸出並計算行數檢查返回碼在java中

相關內容