首页 > 后端开发 > Golang > 为什么我的 Go `exec.Command` 由于通配符而失败,而终端却成功?

为什么我的 Go `exec.Command` 由于通配符而失败,而终端却成功?

Patricia Arquette
发布: 2024-12-08 09:27:12
原创
355 人浏览过

Why Does My Go `exec.Command` Fail with Wildcards While the Terminal Succeeds?

尽管终端成功,Golang Exec 命令仍因通配符失败

在 Go 中,exec 包用于执行外部命令。尝试使用通配符 ('./source-dir/*') 运行“mv”命令时,会出现“退出状态 1”错误,输出显示“没有此类文件或目录”。然而,在带有通配符的终端中运行相同的命令会成功。

为什么通配符在 Go 中失败

与 shell 不同,shell 解释通配符并将其扩展为匹配的列表文件中,exec 包将通配符字面上视为单个参数。这意味着“mv”命令看到的是通配符(“*”)而不是文件名列表。

解决方案

要在 Go 中使用通配符,有两种方法:

  1. 使用 filepath.Glob():此函数返回包含以下内容的字符串切片给定模式的匹配文件名列表。然后,您可以使用此列表作为“mv”命令的参数。
import "path/filepath"

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

cmd := exec.Command("mv", files...)
登录后复制
  1. 调用 Shell:您可以调用 shell 并将命令传递为一个参数,允许 shell 解释通配符并将其扩展为适当的列表
cmd := exec.Command("/bin/sh", "-c", "mv ./source-dir/* ./dest-dir")
登录后复制

递归文件移动

要将所有文件从源目录递归移动到目标目录,您需要递归地迭代源目录,然后移动找到的每个文件或目录。如果源包含子目录,您可以递归地移动每个子目录,或者使用像 os 这样提供移动树功能的包。

以上是为什么我的 Go `exec.Command` 由于通配符而失败,而终端却成功?的详细内容。更多信息请关注PHP中文网其他相关文章!

来源:php.cn
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
作者最新文章
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板