2013-11-21 4 views
2

Go имеет этот пакет и функцииGolang: Переименовать каталог и частично переименовать файл?

package main 

import "os" 

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

Это изменяет имя файла ЛИЦЕНЗИИ е.

Но я хочу сделать следующее и не могу найти, как это сделать. Рубин делает это так, должно идти. Где я должен искать?

  1. Изменить имя каталога не файлы ....

  2. Rename только часть имени. Например, если у меня есть файл или каталог «Пример», я хотел бы изменить «EXA» к «Stq», то это слово будет «Stqmple»

Какой пакет я должен использовать?

Заранее спасибо.

ответ

8
  1. os.Rename будет нормально работать в каталогах, включая окна. Единственный вопрос, который стоит задать здесь, заключается в том, является ли операция атомарной, что на всех основных платформах ответ да.

  2. Если вы хотите найти файлы и каталоги, соответствующие шаблону, вам нужно посмотреть на пакет 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 
} 
+0

Спасибо, это отличный инструмент. Все еще не могу понять, как я могу изменить имена файлов определенных шаблонов ...? Допустим, у меня 1000 файлов префикса name_. И я хочу изменить весь префикс на name1_. Что мне нужно? –

+1

см. Править выше для 'func visit', что делает это – dskinner

+0

Проголосовать x 10000 Спасибо! –

0

Сначала я думаю, что os.Rename также переименовывает каталоги (которые - по крайней мере, под Unix - тоже файлы).

Во-вторых: Может быть, вы можете использовать strings.Replace для таких вещей или сделать некоторые программы здесь?

+0

Спасибо, тогда мне интересно, как я буду соответствовать первому аргументу. Кажется, работает только с полным именем файла. В любом случае, я могу соответствовать части имени файла? –

+1

@ Manyard No. Имена - это имена, а не шаблоны. – Volker

+0

Тогда что мне нужно изменить имена файлов определенных шаблонов? –

Смежные вопросы