2008-10-08 9 views
11

Je veux copier des fichiers texte et les fichiers texte de src/ à dst/Groovy exécuter « cp * » commande shell

 
groovy:000> "cp src/*.txt dst/".execute().text  
===> 
groovy:000> 

Vous pouvez voir la commande exécute w/out erreur mais le fichier src/test.txt ne soit pas copié à dst/

Cela échoue aussi:

 
groovy:000> "cp src/* dst/".execute().text  
===> 
groovy:000> 

Mais ...

 
"cp src/this.txt dst/".execute().text 

fonctionne

Aussi,

 
"cp -R src/ dst".execute().text 

fonctionne

Pourquoi la dose la wild card semblent provoquer ma commande échouer en silence?

Répondre

6

L'expansion générique est effectuée par le shell, et non par cp (ou groovy). Votre premier exemple consiste à essayer de copier un fichier nommé *. Vous pouvez faire votre commande "sh -c 'cp ...'"

13

Merci tedu de m'avoir permis d'aller à mi-chemin.

Je crois que la raison pour laquelle sa solution n'a pas fonctionné était à cause d'un problème d'échappement.

Par exemple ...

 
"sh -c 'ls'".execute() 

œuvres. Mais ...

 
"sh -c 'ls '".execute() 

ne fait pas.

Il y a probablement un moyen d'échapper correctement là en ligne, mais la solution de contournement que je utilise est de passer d'un tableau de chaînes à Runtime.getRuntime(). Exec

 
command = ["sh", "-c", "cp src/*.txt dst/"] 
Runtime.getRuntime().exec((String[]) command.toArray()) 

fonctionne à merveille!

+2

Je pense que vous pouvez simplifier cela avec: commande = .... command.execute() Comme les tableaux comprennent également exécuter – TimM

+2

La raison pour laquelle '" sh -c « cp src/* txt dst /. '' "' ne fonctionne pas parce que Groovy va interpréter un argument de chaîne entre guillemets avec des espaces comme arguments multiples. Donc, groovy est en train d'exécuter sh avec les arguments suivants: arg1 = -c, arg2 = 'cp, arg3 = src/* .txt, arg4 = dst /' Une telle commande résultera en une erreur "Chaîne entre guillemets non terminés". Vous avez la bonne solution, qui consiste à utiliser un tableau. En outre, @TimM a raison, vous pouvez simplifier ce qui précède à '[" sh "," -c "," cp src/*. Txt dst/"]. Execute()' – BennyFlint

+0

Si vous construisez vos commandes dynamiquement le solution avec sh -c et un tableau est la meilleure solution. Faites simplement: def commande = (commande generate ici) def proc = ["sh", "-c", commande] .execute() – henrik

Questions connexes