У меня есть удаленная машина 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? Любая помощь будет оценена по достоинству. Спасибо.

Моя проблема не в выполнении команды. Моя проблема в том, что некоторые аргументы команды по какой-то причине игнорируются.

0
Dan 21 Ноя 2017 в 13:22

1 ответ

Лучший ответ
... "--include", "'**/someDir/*MG*'", "--include", "'*/'", "--exclude", "'*'"

Удалите одинарные кавычки из шаблонов. Они передаются в rsync буквально, и rsync, вероятно, интерпретирует их как часть имен файлов, которые он должен искать.

Короче, попробуйте это:

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

Причина, по которой вы используете одинарные кавычки для этих полей в командной строке, состоит в том, чтобы предотвратить интерпретацию символов * оболочкой, которая интерпретирует ваши команды. Заключение в одинарные кавычки аргументов, содержащих *, заставит оболочку удалить одинарные кавычки и передать символы * буквально программе rsync.

Когда вы запускаете rsync через java ProcessBuilder, оболочка отсутствует, поэтому нет необходимости защищать символы *. Но и символы одинарной кавычки убрать тоже нечего.

1
Kenster 21 Ноя 2017 в 12:57