重命名目录和部分文件重命名

3
Go语言有这个包和函数。
package main

import "os"

func main() {
  os.Rename("LICENSE", "e")
}

这将把文件名LICENSE更改为e。

但我想做的是以下操作,但找不到如何做。Ruby可以做到,Go也应该可以。我应该去哪里查找?

  1. 更改目录名称而不是文件....

  2. 仅重命名名称的一部分。例如,如果我有一个名为“Example”的文件或目录,我想将“Exa”更改为“Stq”,那么单词将变为“Stqmple”

我应该使用哪个包?

提前致谢。

2个回答

12
  1. os.Rename 可以在包括Windows在内的目录中正常工作。这里唯一需要质疑的是操作是否原子化,但在所有主要平台上的答案都是是。

  2. 如果你想定位与模式匹配的文件和目录,你需要查看 filepath 包。使用此包可以让您遍历一个目录,然后检查每个文件并将其名称与您的要求进行匹配。请查看文档中的 func Walktype WalkFnhttp://golang.org/pkg/path/filepath/#Walk

下面是使用 Walk 在给定目录或其任何子目录中定位 png 文件的示例:

package main

import (
    "flag"
    "fmt"
    "os"
    "path/filepath"
)

var flagPath = flag.String("path", "", "recursively traverse path and print png filepaths to stdout.")

func visit(path string, f os.FileInfo, err error) error {
    if filepath.Ext(path) == ".png" {
        fmt.Println(path)
    }
    return nil
}

func main() {
    flag.Parse()
    if *flagPath == "" {
        flag.Usage()
        return
    }
    filepath.Walk(*flagPath, visit)
}

这里是一个 func visit,它可以完成您在评论中询问的操作,请确保导入了 "strings":

func visit(path string, f os.FileInfo, err error) error {
    if name := f.Name(); strings.HasPrefix(name, "name_") {
        dir := filepath.Dir(path)
        newname := strings.Replace(name, "name_", "name1_", 1)
        newpath := filepath.Join(dir, newname)
        fmt.Printf("mv %q %q\n", path, newpath)
        os.Rename(path, newpath)
    }
    return nil
}

谢谢,这是一个很棒的工具。但我还是不知道如何更改特定模式的文件名...?比如说,我有1000个以前缀name_开头的文件。我想把所有前缀都改成name1_。我需要做什么? - user2671513

0
首先,我认为os.Rename也可以重命名目录(至少在Unix下是文件)。
其次:也许你可以使用strings.Replace来处理这些事情,或者在这里进行一些编程?

谢谢,那我想知道如何匹配第一个参数。似乎只能使用完整的文件名来工作。有没有办法可以匹配文件名的一部分? - user2671513
1
@Manyard 不是模式,而是名称。 - Volker
那么我需要更改特定模式的文件名需要做什么? - user2671513
你想写一些代码吗?也许是迭代给定的文件名并更改模式的代码?我承认我不理解这个问题... - Volker

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