2017-11-21 2 views
-1

Ich habe eine Remote-Linux-Maschine, die ich gerne Dateien mit rsync basierend auf einem bestimmten Muster in der Datei auf einem lokalen Computer ziehen würde.Ich kann keine rsync-Dateien basierend auf einem Muster mit Java

Wenn ich in das Terminal-Fenster Ich bin in der Lage, diese Aufgabe mit dem nächsten Befehl auszuführen:

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/ 

Als Ergebnis dieses Befehls alle Dateien aus dem baseDir Verzeichnis kopieren Ich bin in der Lage und seine Unterverzeichnisse, die 'MG' in ihrem Namen enthalten.

Ich versuche, das gleiche Ergebnis mit einem Java-Code zu erreichen:

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();} 
    } 
} 

Aber ich alle Dateien im Verzeichnis baseDir zog am landen. Was mache ich falsch? Warum würde Java die Optionen include und exclude nicht erkennen? Jede Hilfe wäre willkommen. Vielen Dank.

Mein Problem führt den Befehl nicht aus. Mein Problem ist, dass einige der Argumente des Befehls aus irgendeinem Grund ignoriert werden.

+2

Mögliche Duplikat [Java Process mit mehreren params mit Leerzeichen] (https://stackoverflow.com/questions/15111517/java-processbuilder-with-multiple-params-with-spaces) – Joe

+0

Das ist nicht wirklich hilfreich war. Es ist nicht so, dass ich den Befehl nicht ausführen kann, es ignoriert nur einige der Parameter. – Dan

Antwort

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

Entfernen Sie die einfachen Anführungszeichen aus den Mustern. Sie werden wörtlich an rsync übergeben und rsync interpretiert sie wahrscheinlich als Teil der Dateinamen, nach denen sie suchen soll.

Kurz gesagt, versuchen Sie dies:

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

Der Grund, warum Sie einfache Anführungszeichen für für diese Felder auf der Kommandozeile verwenden, ist die * Zeichen zu verhindern, dass von der Shell interpretiert werden, die Ihre Befehle interpretiert. Durch einfaches Anführen der Argumente, die * enthalten, wird die Shell die einfachen Anführungszeichen entfernen und die * Zeichen wörtlich an das rsync-Programm übergeben.

Wenn Sie Rsync durch Java ProcessBuilder ausführen gibt es keine Shell, so dass die * Zeichen nicht geschützt werden müssen. Aber es gibt auch nichts, um die einfachen Anführungszeichen zu entfernen.

+0

Das funktioniert großartig. Vielen Dank. – Dan

Verwandte Themen