2017-11-21 7 views
-1

ローカルマシンのファイルの特定のパターンに基づいて、ファイルを引き出すリモートLinuxマシンがあります。rsyncを使用しています。Javaを使用したパターンに基づいてファイルをrsyncできない

私は、ターミナルウィンドウにいるとき、私は、次のコマンドを使用してこのタスクを実行することができる午前:このコマンドの結果

rsync -avzrm --include '**/someDir/*MG*' --include '*/' --exclude '*' -e "ssh -i /home/localUser/.ssh/id_rsa -l remoteUser" [email protected]:/home/remoteUser/baseDir/ /home/localUser/testDir/ 

を私はbaseDirディレクトリ内のすべてのファイルをコピーすることができていますし、その名前に 'MG'を含むサブディレクトリ。

私はJavaコードを使用して同じ結果を達成しようとしています:

public class DataDumper { 
    public static void main (String[] args){ 
     try { 

      String[] cmd = new String[]{"rsync", "-avzrm", "--include", "'**/someDir/*MG*'", "--include", "'*/'", "--exclude", "'*'", 
             "-e", "ssh -i /home/localUser/.ssh/id_rsa -l ec2-user", 
             "[email protected]:/home/remoteUser/baseDir/", "/home/localUser/testing"}; 
      Process p = new ProcessBuilder().command(cmd).inheritIO().start(); 
     } 
     catch (IOException ex) {ex.printStackTrace();} 
     catch (Throwable th) {th.printStackTrace();} 
    } 
} 

しかし、私はbaseDirディレクトリ内のすべてのファイルを引き上げ終了しています。 何が間違っていますか?なぜjavaはincludeexcludeオプションを認識しませんでしたか? ご協力いただければ幸いです。ありがとうございました。

私の問題はコマンドを実行していません。 私の問題は、コマンドの引数のいくつかが何らかの理由で無視されることです。

+2

[Java ProcessBuilderと複数のパラメータをスペースで区切った]の複写が可能です(https://stackoverflow.com/questions/15111517/java-processbuilder-with-multiple-params-with-spaces) – Joe

+0

これは本当に役に立たなかったです。私はコマンドを実行することができないわけではなく、いくつかのパラメータを無視するだけです。 – Dan

答えて

0
... "--include", "'**/someDir/*MG*'", "--include", "'*/'", "--exclude", "'*'" 

パターンから一重引用符を削除します。彼らは文字通りrsyncに渡されています。そして、rsyncはおそらく、それらを探すべきファイル名の一部としてそれらを解釈しています。

要するに、これを試してみてください。

... "--include", "**/someDir/*MG*", "--include", "*/", "--exclude", "*" 

コマンドラインでこれらのフィールドのための単一引用符を使用する理由は、あなたのコマンドを解釈しているシェルによって解釈され*文字を防ぐためです。 *を含む引数をシングルクォートすると、シェルは単一引用符を削除して、*文字を文字通りrsyncプログラムに渡します。

rsyncからjavaのProcessBuilderを実行しているときにシェルがないので、*文字を保護する必要はありません。しかし、一重引用符文字を削除することもありません。

+0

それは素晴らしい作品です。ありがとうございました。 – Dan

関連する問題