golang 在终端中运行的 exec 命令失败

标签 go

当我尝试使用 exec 包运行 mv 命令时出现错误。

这是我正在尝试做的一个例子:

cmd := exec.Command("mv", "./source-dir/*", "./dest-dir")
output, err := cmd.CombinedOutput()

cmd.Run()

err 返回以下内容 退出状态 1

输出返回此 mv: rename ./source-dir/* to ./dest-dir/*: No such file or directory

当我更改这一行时,我实际上可以让脚本工作:

cmd := exec.Command("mv", "./source-dir/*", "./dest-dir")

以下内容:

cmd := exec.Command("mv", "./source-dir/file.txt", "./dest-dir")

该命令有效并成功移动文件,但使用通配符无效。星号似乎没有在命令中用作通配符。这是为什么?在 GO 中还有其他使用通配符的方法吗?如果不是,那么我还能如何将所有文件从 source-dir 递归移动到 dest-dir

谢谢

最佳答案

当您在 shell 中键入命令时,shell 获取 ./source_dir/* 并将其替换为所有匹配文件的列表,每个参数一个。 mv 命令查看文件名列表,而不是通配符。

您需要做的是自己做同样的事情(使用 filepath.Glob 返回匹配文件的 []string),或者调用 shell 以便它可以完成工作(使用 exec.Command("/bin/sh", "-c", "mv ./source_dir/* ./dest_dir"))。

关于golang 在终端中运行的 exec 命令失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31467153/

相关文章:

struct - 对结构类型使用 setter 无法按预期工作

validation - 验证结构的惯用方法

angularjs - 如何使用动态插入的端口号将 URL 重定向到相同的 URL

go - 如何正确检查 io.Reader 是否为零?

go - 无法通过 var.MethodName() 从另一个包访问方法

mongodb - findOneAndUpdate(updateQuery, updateSet, returnFields) 的返回类型是什么,如何获取返回值?

go - 如何将函数内部创建的变量作为指向另一个函数的指针传递

go - KrakenD 插件读取配置设置

mongodb - 如何在mgo框架中使用mongodb 3.6的数组过滤器?

go - 解析Golang中的dynamodb.GetItemOutput类型