无法基于使用java的模式重新同步文件
我有一台远程Linux机器,我想根据本地机器上文件中的特定模式,使用无法基于使用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/ /
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,因此不需要保护*
字符。但是也没有什么可以删除单引号字符。可能重复的单引号字符并没有真正的帮助。并不是我不能执行命令,只是忽略了一些参数。