os.Rename
will work fine on directories, including windows. The only bit to question here is whether the operation is atomic, which on all major platforms the answer is yes.
If you want to locate files and directories that match a pattern, you'll want to look at the filepath package. This will let you traverse a directory at which point you can inspect each file and match the name against your requirements. Look at func Walk
and type WalkFn
of the documentation. http://golang.org/pkg/path/filepath/#Walk
Here's an example of using Walk
to locate png files in a given directory or any of its subdirectories:
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)
}
Here's a func visit
that does what your asking about in the comment, be sure to import "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
", path, newpath)
os.Rename(path, newpath)
}
return nil
}