2017-09-27 4 views
0

Les commandes suivantes fonctionne directement:commande Rsync ne fonctionne pas en java

rsync -rtuc --delete-after --exclude '.git*' --filter 'protect .git/**/*' ~/some/source/ ~/some/destination/ 

Mais lorsqu'il est exécuté via java:

private Boolean syncFiles() { 
      // Success flag default to true 
      Boolean success = true; 
      // Attempt sync repo 
      try { 
       ProcessBuilder runtimeProcessBuilder = new ProcessBuilder().inheritIO().command(new String[]{ 
        "rsync", "-rtuc","--delete-after", "--exclude", "'.git*'", "--filter", "'protect .git/**/*'", "~/some/source/", "~/some/destination/" 
       }); 
       // Wait until process terminates 
       int output = runtimeProcessBuilder.start().waitFor(); 
       // Determine if successful 
       if (output == 0) { 
        System.out.println("Backup of " + getSource() + " to " + getDestination() 
          + " was successful"); 
       } else { 
        System.out.println("Error: rsync returned error code: " + output); 
        success = false; 
       } 
      } catch (Exception ex) { 
       success = false; 
       System.out.println("Error:"); 
       System.out.println(ex.getMessage()); 
       Logger.getLogger(Rsync.class.getName()).log(Level.SEVERE, null, ex); 
      } 
      return success; 
    } 

Je reçois l'erreur:

Unknown filter rule: `'protect .git/**/*'' Error: rsync returned error code: 1 rsync error: syntax or usage error (code 1) at exclude.c(902) [client=3.1.2]

Répondre

0

La réponse à la solution est la suivante:

Le ProcessBuilder objet doit être initialisé comme suit:

ProcessBuilder runtimeProcessBuilder = new ProcessBuilder().inheritIO().command(new String[]{ 
    "rsync", "-rtuc","--delete-after", "--filter", "protect .git", "--exclude", "'.git*'", "~/some/source/", "~/some/destination/" 
}); 
0

La coquille gère citer avant de transmettre les paramètres de la commande.

Le entre en jeu avec cette partie de votre ligne de commande:

'protect .git/**/*' 

Le shell interprète cela comme le seul paramètre:

protect .git/**/* 

Si les guillemets simples avaient pas été là en premier placez, la coquille aurait:

  • interprété comme deux paramètres (à cause de l'espace)
  • caractères glob supplémentaires comme des "*"

La solution est de passer:

"protect .git/**/" 

comme l'un de vos paramètres Java, plutôt que "'protect .git/**/*'".

Vous pouvez rencontrer des problèmes similaires avec ~, que le shell développera dans votre répertoire personnel.