无法根据使用 java 的模式同步文件
Unable to rsync files based on a pattern using java
我有一台远程 Linux 机器,我想根据本地机器上文件中的特定模式使用 rsync
提取文件。
当我在终端中时 window 我可以使用下一个命令执行此任务:
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,所以没有必要保护 *
字符.但是也没有什么可以删除单引号字符。
我有一台远程 Linux 机器,我想根据本地机器上文件中的特定模式使用 rsync
提取文件。
当我在终端中时 window 我可以使用下一个命令执行此任务:
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,所以没有必要保护 *
字符.但是也没有什么可以删除单引号字符。