
我正在運行 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
標誌--info
onrsync
將輸出傳輸的任何檔案的路徑。的退出代碼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中。