2017-11-21 18 views
-1

로컬 컴퓨터의 파일에있는 특정 패턴을 기반으로 파일을 가져 오려는 원격 Linux 컴퓨터가 있습니다.자바를 사용하는 패턴을 기반으로 파일을 rsync 할 수 없습니다

내가 다음 명령을 사용하여이 작업을 수행 할 수 있어요 터미널 창에서 오전 때 : 나는 baseDir 디렉토리 내의 모든 파일을 복사 할 수 있어요이 명령의 결과로

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/ 

및 그들의 이름에 'MG'를 포함하는 하위 디렉토리. 내가 baseDir 디렉토리 내에있는 모든 파일을 당겨 끝나는하고,

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

을하지만 :

나는 자바 코드를 사용하여 동일한 결과를 달성하기 위해 노력하고 있습니다. 내가 뭘 잘못 했니? 왜 자바는 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