Go

Goで指定したディレクトリ配下のファイルをフラットにする

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 を使えばもっと簡単に出来たのか、と今気付いた(´°̥ω°̥`)