首页 >后端开发 >Golang >为什么带通配符的'mv”在 Go 和 Bash 中表现不同?

为什么带通配符的'mv”在 Go 和 Bash 中表现不同?

Patricia Arquette
Patricia Arquette原创
2024-12-10 18:48:11915浏览

Why Does `mv` with Wildcards Behave Differently in Go and Bash?

在 Go 和 Bash 中执行 mv 命令的方式不同

在 Go 中,使用 exec 包执行 mv 命令可能会导致使用时出现问题命令参数中的通配符如“*”。虽然该命令在终端中按预期工作,但星号通配符似乎在 Go 脚本中不起作用。

这种差异的原因在于 shell 和 Go 处理命令参数的方式。在终端中,shell 解释通配符并将其替换为匹配文件名列表。但是,在 Go 中,命令作为字符串传递,并且它会将通配符视为参数的一部分。

要解决此问题,您有两个选项:

手动扩展通配符

你可以使用Go的filepath.Glob函数来获取与通配符匹配的文件列表模式,然后将各个文件名作为参数传递给 exec.Command。例如:

files, err := filepath.Glob("./source-dir/*")
if err != nil {
    // Error handling
}

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

使用 Shell 调用

您可以调用 shell 本身来执行带有通配符的 mv 命令。 shell 将解释通配符并将扩展参数传递给 mv 命令。例如:

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

通过使用其中一种方法,您可以确保在 Go 脚本中正确处理通配符,从而允许您按预期执行 mv 命令。

以上是为什么带通配符的'mv”在 Go 和 Bash 中表现不同?的详细内容。更多信息请关注PHP中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn