LoginSignup
2
2

More than 5 years have passed since last update.

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

Posted at

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

2
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
2