Groovy执行"cp *" shell命令

15
我想复制文本文件并仅从src/复制到dst/
groovy:000> "cp src/*.txt dst/".execute().text       
===> 
groovy:000> 
您可以看到命令执行时没有错误,但文件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
可以工作
为什么通配符似乎导致我的命令静默失败?
2个回答

17

感谢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())

完美地奏效了!


2
我认为你可以简化它:command = .... command.execute()因为数组也能理解execute。 - TimM
2
"sh -c 'cp src/*.txt dst/''" 无法正常工作的原因是 Groovy 会将带有空格的引号字符串参数解释为多个参数。因此,Groovy 实际上使用以下参数执行 sh: arg1 = -c,arg2 = 'cp,arg3 = src/*.txt,arg4 = dst/' 这样的命令将导致 "Unterminated quoted string" 错误。您已经有了正确的解决方案,即使用数组。同时,@TimM 是正确的,您可以将上述代码简化为 ["sh", "-c", "cp src/*.txt dst/"].execute() - BennyFlint
如果您正在动态构建命令,则使用sh -c和数组的解决方案是最佳解决方案。只需执行以下操作: def command =(在此处生成命令) def proc = ["sh", "-c", command].execute() - henrik
当我使用["sh", "-c", "cp *.png dest/"].execute()时,仍然会出现“*.png:没有这样的文件或目录”的错误。 - devios1

7
通配符扩展是由shell执行的,而不是由cp(或groovy)执行的。你的第一个例子试图复制一个名为*的文件。你可以将命令改为“sh -c 'cp ...'”。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接