ローカルファイルが更新されたことを報告するには、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/

これにより、更新されたファイルとディレクトリの名前が1行に1つずつ標準出力(fd = 0)に印刷されます。

次に出力を収集し、rsync文字列の改行数を計算します。

出力を収集する良い方法はこの答えで見つけることができると思いますjavaが、まだ試していません。https://stackoverflow.com/a/9048519/5484716

するいいえ標準出力と標準エラーストリームを使用するredirectErrorStreamか、別の方法で組み合わせます。これにより、エラーメッセージは更新されたファイルと見なされますが、これは望ましい結果ではありません。

答え2

rsync印刷コピーファイル名を持つ@DavidKingのアイデアに基づいており、stdinが空のときにgrepがゼロ以外の終了状態で終了するという@yashmaの情報を拡張すると、満足できるほど短く不思議な1行の内容を思い出すことができますあります。

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

答え3

フラグをオン--infoにするとrsync、転送されたすべてのファイルのパスが出力されます。終了コードは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

rsync次に、コマンドを直接呼び出すのではなく、Javaでスクリプトを呼び出します。rsync送信の開始と終了に追加のテキスト行がある可能性があるため、追加のif出力行を考慮してステートメントを調整する必要があるかもしれませんが、デフォルトのアイデアは機能します。

答え4

戻りコードで情報を取得する方法は、シェルスクリプトを作成し、rsyncjavaでシェルスクリプトを呼び出して実行することです。以下に要約するように、ここにはいくつかの重要な問題があります。シェルスクリプトは次のとおりです。

#!/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で

関連情報