os.Rename
будет нормально работать в каталогах, включая окна. Единственный вопрос, который стоит задать здесь, заключается в том, является ли операция атомарной, что на всех основных платформах ответ да.
Если вы хотите найти файлы и каталоги, соответствующие шаблону, вам нужно посмотреть на пакет 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
, что делает то, что ваш просят о в комментарии, убедитесь, для импорта «строк»:
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_. Что мне нужно? –
см. Править выше для 'func visit', что делает это – dskinner
Проголосовать x 10000 Спасибо! –