无法使用java基于模式rsync文件

时间:2017-11-21 10:22:22

标签: 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/ /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无法识别includeexclude选项? 任何帮助,将不胜感激。谢谢。

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

1 个答案:

答案 0 :(得分:1)

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

从模式中删除单引号。它们正在逐字传递给rsync,而rsync可能将它们解释为它应该寻找的文件名的一部分。

简而言之,试试这个:

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

在命令行上对这些字段使用单引号的原因是为了防止解释命令的shell解释*个字符。单引号包含*的参数将导致shell删除单引号并将*字符传递给rsync程序。

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