无法基于使用java的模式重新同步文件

无法基于使用java的模式重新同步文件,java,linux,ssh,rsync,Java,Linux,Ssh,Rsync,我有一台远程Linux机器,我想根据本地机器上文件中的特定模式,使用rsync从中提取文件 当我在终端窗口中时,我可以使用下一个命令执行此任务: rsync -avzrm --include '**/someDir/*MG*' --include '*/' --exclude '*' -e "ssh -i /home/localUser/.ssh/id_rsa -l remoteUser" remotrUser@ip.address.net:/home/remoteUser/baseDir/ /

我有一台远程Linux机器,我想根据本地机器上文件中的特定模式,使用
rsync
从中提取文件

当我在终端窗口中时,我可以使用下一个命令执行此任务:

rsync -avzrm --include '**/someDir/*MG*' --include '*/' --exclude '*' -e "ssh -i /home/localUser/.ssh/id_rsa -l remoteUser" remotrUser@ip.address.net:/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",
                                        "remoteUser@ip.address.net:/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不能识别
include
exclude
选项? 任何帮助都将不胜感激。多谢各位

我的问题是没有执行命令。 我的问题是,由于某种原因,命令的一些参数被忽略了

... "--include", "'**/someDir/*MG*'", "--include", "'*/'", "--exclude", "'*'"
从模式中删除单引号。它们被逐字传递给rsync,rsync可能将它们解释为它应该查找的文件名的一部分

简言之,请尝试以下方法:

... "--include", "**/someDir/*MG*", "--include", "*/", "--exclude", "*"
在命令行中对这些字段使用单引号的原因是为了防止解释命令的shell解释
*
字符。单引号引用包含
*
的参数将导致shell删除单引号,并将
*
字符逐字传递给rsync程序


当您通过java的
ProcessBuilder
运行rsync时,没有shell,因此不需要保护
*
字符。但是也没有什么可以删除单引号字符。

可能重复的单引号字符并没有真正的帮助。并不是我不能执行命令,只是忽略了一些参数。