この記事の目的
- Go言語でディレクトリを作れるようになる
- Go言語でパーミッションを指定してディレクトリを作れるようになる
- Go言語でツリー構造のディレクトリを作れるようになる
準備
適当に作業用のディレクトリを作る:
mkdir ~/Desktop/gofile
cd ~/Desktop/gofile/
処理を書いていくGoのファイルを作ってエディタで開く:
touch main.go
ディレクトリを作る
ディレクトリの作り方を覚える。os
モジュールの Mkdir
で作れる。
package main
import "os"
func main() {
os.Mkdir("/tmp/go-dir1", 0777)
}
実行する:
go run main.go
できたか見てみる:
% ls -la /tmp/
...
drwxr-xr-x 2 suin wheel 68 Dec 10 16:04 go-dir1
できているが、パーミッションが 755
になっている…
パーミッション777でディレクトリを作る
上での例は、どうやら umask の設定が反映された結果と思われる。
umaskを復習する:
(エディタでも touch コマンドでも何でもいいから)ファイルを作成すると、そのファイルのパーミッションは、普通 644 (rw-r--r--) となるはずである。これはもっともな話で、新しいファイルを作るたびにパーミッションが 666 (rw-rw-rw-) や 777 (rwxrwxrwx) になっていては誰でも書き込めてしまい、いちいち chmod しなくてはならず不便である。このように、新規作成したファイル・ディレクトリのパーミッションを決めるのが、umask である。
umask は、新しくファイルを作成する際に、許可*しない*ビットを示すものである。普通、ファイルの新規作成時はファイルの実行ビット (eXecute) は立てないので、umask が 022 ということは、666 から 022 を引いた 644 というパーミッションで新規ファイルが作られることになる。umask が 002 なら 664 、 umask が 000 なら 666 となる。
出典: http://x68000.q-e-d.net/~68user/unix/pickup?umask
デフォルトの umask値 を確認する:
% umask
022
Go言語ではsyscall.Umask
でumask値を変更できる。
一旦、umask値を変更して、0777でディレクトリを作り、umask値を元に戻すように変更したコード:
package main
import (
"os"
"syscall"
)
func main() {
defaultUmask := syscall.Umask(0)
os.Mkdir("/tmp/go-dir2", 0777)
syscall.Umask(defaultUmask)
}
実行する:
go run main.go
777でディレクトリが作成された:
% ls -la /tmp/
...
drwxrwxrwx 2 suin wheel 68 Dec 10 16:22 go-dir2
chmodでパーミッションを変える別解
umask値を変えてもいいが、chmodで後からパーミッションを変える方法もある:
package main
import (
"os"
)
func main() {
directory := "/tmp/go-dir3"
os.Mkdir(directory, os.ModePerm)
os.Chmod(directory, 0777)
}
実行する:
go run main.go
777のディレクトリが作成された:
% ls -la /tmp/
…
drwxrwxrwx 2 suin wheel 68 Dec 10 16:26 go-dir3
ツリー構造のディレクトリを作る
下記の図のように、親ディレクトリ /tmp/go-dirs/
を作り、その中に小ディレクトリ 01~10
を作るコードを書いてみる
/tmp/go-dirs/
├── 01
├── 02
├── 03
├── 04
├── 05
├── 06
├── 07
├── 08
├── 09
└── 10
os.MkdirAll
を使うと、親ディレクトリがなければ親ディレクトリを作ってくるので、今回はそれを使ってコードを書く:
package main
import (
"fmt"
"os"
)
func main() {
for i := 1; i <= 10; i++ {
os.MkdirAll(fmt.Sprintf("/tmp/go-dirs/%02d", i), os.ModePerm)
}
}
実行してみる:
go run main.go
結果:
% tree /tmp/
/tmp/
...
├── go-dirs
│ ├── 01
│ ├── 02
│ ├── 03
│ ├── 04
│ ├── 05
│ ├── 06
│ ├── 07
│ ├── 08
│ ├── 09
│ └── 10
...