【问题标题】:Rename the directory and partial file renaming重命名目录和部分文件重命名
【发布时间】:2013-12-05 14:09:36
【问题描述】:

Go 有这个包和功能

package main

import "os"

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

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

但我想要做的是以下,找不到如何去做。 Ruby 这样做,Go 也应该这样做。我应该往哪里看?

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

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

我应该使用什么包?

提前致谢。

【问题讨论】:

    标签: file go system


    【解决方案1】:
    1. os.Rename 可以在包括 Windows 在内的目录上正常工作。这里唯一要质疑的是操作是否是原子的,在所有主要平台上答案都是肯定的。

    2. 如果要查找与模式匹配的文件和目录,则需要查看文件路径包。这将允许您遍历一个目录,此时您可以检查每个文件并根据您的要求匹配名称。查看文档的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,可以满足您在评论中的要求,请务必导入“字符串”:

    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_。我需要什么?
    【解决方案2】:

    首先我认为os.Rename 也会重命名目录(至少在 Unix 下也是文件)。

    第二:也许你可以用strings.Replace来做这些事情或者在这里做一些编程?

    【讨论】:

    • 谢谢,那么我想知道如何匹配第一个参数。似乎只使用 FULL 文件名。无论如何我可以匹配文件名的一部分吗?
    • @Manyard No. 名称是名称而不是模式。
    • 那么我需要更改某些模式的文件名吗?
    • 你会写一些代码吗?也许是迭代给定文件名并改变模式的东西?我承认我不明白这个问题......
    猜你喜欢
    • 2015-10-08
    • 1970-01-01
    • 2019-02-05
    • 2016-11-07
    • 1970-01-01
    • 2021-06-09
    • 2022-01-09
    • 2020-01-29
    • 2010-11-26
    相关资源
    最近更新 更多