util.ExecuteCommandWithOuput(exec.Command("cp", "-r", "./*.json", artifact.dir))
func ExecuteCommandWithOuput(cmd *exec.Cmd) {
output, err := cmd.Output()
if err != nil {
log.Print("Error executing ", cmd.Args, err)
}
fmt.Print(string(output))
}
输出
2017/01/16 13:26:35 Error executing [cp -r ./*.json myartifact] exit status 1
问题
我刚刚开始采用Go,因此是Go的新人。
答案 0 :(得分:2)
你不能在exec.Command
中使用外卡。我将遍历目录中的文件并检查扩展名是否以.json
结尾,然后复制该文件。
答案 1 :(得分:1)
解释:所谓的“通配符”由shell执行命令行命令扩展。也就是说,当您调用cp -r ./*.json dir/
时,shell会自动扩展*.json
- 生成与该模式匹配且位于当前目录中的文件的名称列表并传递{{1}命令这些名称的列表。
因此,如果你有10个匹配的文件,那么对cp
的实际调用最终会看起来像
cp
当你直接传递调用cp -r file1.json file2.json ... dir/
而没有shell开始并为你扩展cp ...
“fileglob”时,*.json
命令会收到文件名“* .json “逐字逐句地试图打开它。由于名为“* .json”的文件据称不存在,cp
会失败并退出。
第一个(诚然是蹩脚的)解决方案是通过“shell”调用cp
“。也就是说,将您对cp
的调用转换为shell脚本并将其传递给shell。
最简单的方法是使用
之类的东西cp
这将调用shell exec.Command(`/bin/sh -c 'cp -r ./*.json manifest'`)
并将脚本传递给它,以通过其/bin/sh
命令行选项执行。
另一种解决方案是使用标准Go库自行滚动复制:-c
包的功能支持扩展fileglobs,因为shell会执行此操作并迭代给定目录的条目。使用这些方法中的任何一种,您都可以构建要复制和/或迭代它们的文件列表。
然后您可以使用函数path/filepath
打开源文件和目标文件,然后使用os.OpenFile()
复制它们之间的内容。
答案 2 :(得分:0)
使用内部使用io的https://github.com/juju/utils/blob/master/fs/copy.go,os包