Groovy执行"cp*"shell命令

JJo*_*son 13 groovy

我想文本文件和纯文本文件从复制src/dst/

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

您可以看到命令执行w/out错误但文件src/test.txt未被复制到dst/

这也失败了:

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

然而...

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

作品

也,

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

作品

为什么剂量的外卡似乎导致我的命令无声地失败?

JJo*_*son 15

谢谢tedu让我在那里一半.

我认为他的解决方案不起作用的原因是因为"逃避"问题.

例如...

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

作品.但...

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

才不是.

可能有一种方法可以在那里正确地逃避它,但我正在使用的解决方法是将一个字符串数组传递给Runtime.getRuntime().exec

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

工作得很漂亮!

  • 我认为你可以用以下方法简化:command = .... command.execute()因为数组也理解执行 (2认同)
  • "sh -c'cp src/*.txt dst /''"`不起作用的原因是因为Groovy会将带有空格的带引号的字符串参数解释为多个参数.所以groovy实际上是用以下args执行sh:arg1 = -c,arg2 ='cp,arg3 = src/*.txt,arg4 = dst /'这样的命令将导致"未终止的引用字符串"错误.您有正确的解决方案,即使用数组.另外,@ TimM是对的,你可以将上面简化为`["sh"," - c","cp src/*.txt dst /"] .execute()` (2认同)

use*_*392 6

通配符扩展由shell执行,而不是由cp(或groovy)执行.您的第一个示例是尝试复制名为*的文件.你可以命令"sh -c'cp ......'"