Goで指定したディレクトリ配下のファイルをフラットにするロジック。
これを、
$ tree
.
├── file_1.txt
├── file_2.txt
├── sample_1
│ ├── file_3.txt
│ └── file_4.txt
└── sample_2
├── file_5.txt
├── file_6.txt
└── sample_3
├── file_7.txt
└── file_8.txt
こうする。
$ tree
.
├── file_1.txt
├── file_2.txt
├── file_3.txt
├── file_4.txt
├── file_5.txt
├── file_6.txt
├── file_7.txt
└── file_8.txt
ソース
dirFlatten.go
package main
import (
"io/ioutil"
"os"
"path/filepath"
)
func main() {
baseDir := "/tmp/test"
dirFlatten(baseDir, baseDir)
deleteDir(baseDir)
}
func dirFlatten(dir string, base string) error {
files, err := ioutil.ReadDir(dir)
if err != nil {
return err
}
for _, file := range files {
if file.IsDir() {
err = dirFlatten(filepath.Join(dir, file.Name()), base)
if err != nil {
return err
}
continue
}
err = os.Rename(filepath.Join(dir, file.Name()), filepath.Join(base, file.Name()))
if err != nil {
return err
}
}
return nil
}
func deleteDir(dir string) error {
files, err := ioutil.ReadDir(dir)
if err != nil {
return err
}
for _, file := range files {
if file.IsDir() {
err = os.RemoveAll(filepath.Join(dir, file.Name()))
if err != nil {
return err
}
}
}
return nil
}
実行
$ go run dirFlatten.go
参考
Golangでディレクトリ内のファイル一覧を入手するのコメントで紹介されていた https://golang.org/pkg/path/filepath/#Walk を使えばもっと簡単に出来たのか、と今気付いた(´°̥ω°̥`)