Go has this package and function
package main
import "os"
func main() {
os.Rename("LICENSE", "e")
}
This changes the filename LICENSE to e.
But what I want to do is the following and can't find how to do it. Ruby does this so should Go. Where should I look up?
Change the name of directory not files....
Rename just the part of the name. For example, if I have a file or directory "Example", I would want to change "Exa" to "Stq," then the word would be "Stqmple"
What package should I use?
Thanks in advance.
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\n", path, newpath)
os.Rename(path, newpath)
}
return nil
}