2008-10-08 13 views
11

Chcę skopiować pliki tekstowe i tylko pliki tekstowe z src/ do dst/Groovy wykonać polecenie „cp *” shell

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

widać polecenia wykonuje w/out błędu ale plik src/test.txt nie zostanie skopiowany do dst/

ta zawodzi również:

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

jednak ...

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

działa

Również

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

działa

Dlaczego dozować dzika karta wydaje się powodować moje polecenie, aby po cichu nie?

Odpowiedz

6

Ekspansja wieloznaczna wykonywana jest przez powłokę, a nie przez cp (lub groovy). Twój pierwszy przykład to próba skopiowania pliku o nazwie *. Możesz wydać komendę "sh -c 'cp ..." "

13

Dzięki tedu za złapanie mnie w połowie drogi.

Uważam, że powodem, dla którego jego rozwiązanie nie zadziałało, był problem "ucieczki".

Na przykład ...

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

prace. Ale ...

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

nie.

Nie ma chyba sposób uciec prawidłowo w wierszu, ale obejście używam jest przekazać tablicę ciągów do Runtime.getRuntime(). Exec

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

działa pięknie!

+2

myślę, że można uprościć z: polecenia = .... command.execute() jako tablice również zrozumieć wykonać – TimM

+2

tego powodu, że '" sh -c „cp src/* txt DST /. "" "nie działa, ponieważ Groovy zinterpretuje cytowany ciąg znaków z białymi spacjami jako wieloma argumentami. Tak więc groovy w rzeczywistości wykonuje sh z następującymi argumentami: arg1 = -c, arg2 = 'cp, arg3 = src/*. Txt, arg4 = dst /' Takie polecenie spowoduje błąd "Ciągnik bez cudzysłowów". Masz prawidłowe rozwiązanie, które polega na użyciu tablicy. Również, @TimM ma rację, możesz uprościć powyższe do '[" sh "," -c "," cp src/*. Txt dst/"]. Execute()' – BennyFlint

+0

Jeśli budujesz polecenia dynamicznie rozwiązanie z sh -c i tablicą jest najlepszym rozwiązaniem. Po prostu wykonaj: def polecenie = (tutaj wytworzymy polecenie) def proc = ["sh", "-c", polecenie] .execute() – henrik

Powiązane problemy