os.Rename
可以在包括Windows在内的目录中正常工作。这里唯一需要质疑的是操作是否原子化,但在所有主要平台上的答案都是是。
如果你想定位与模式匹配的文件和目录,你需要查看 filepath 包。使用此包可以让您遍历一个目录,然后检查每个文件并将其名称与您的要求进行匹配。请查看文档中的 func Walk
和 type WalkFn
。http://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
}