【Go】Go言語でgzファイルをまとめる

たまたまgzファイルを一つにまとめる(=コンカチする)必要があったのでやってみました。
読み込んだ時にバイナリーで扱ってるんで、そのまま書いてしまえばいいから簡単ですね。

準備

ファイル

こんな感じの適当なファイルを用意しました。

cat aaaaa.txt

aaaaaaaaaa
AAAAAAAAAA
1111111111
cat bbbbb.txt

bbbbbbbbbb
BBBBBBBBBB
2222222222
cat ccccc.txt

cccccccccc
CCCCCCCCCC
3333333333

それをそれぞれgzipに固めておきます。

gzip aaaaa.txt
gzip bbbbb.txt
gzip ccccc.txt
ls
aaaaa.txt.gz bbbbb.txt.gz ccccc.txt.gz

このgzファイルをtest_dirに入れておきます。

フォルダ構成

実行する前にフォルダ構成を提示しておきます。

pack_gz_files.go
test_dir
    aaaaa.txt.gz
    bbbbb.txt.gz
    ccccc.txt.gz

実行スクリプト

goのコード

pack_gz_files.go

concatenate gz files

os.OpenFile

https://golang.org/pkg/os/#OpenFile

func OpenFile(name string, flag int, perm FileMode) (*File, error)

ファイルのポインタが取得できます。

ReadFile

https://golang.org/pkg/io/ioutil/#ReadFile

func ReadFile(filename string) ([]byte, error)

読み込んだファイルはバイト型で返されます。

(*File) Write

https://golang.org/pkg/os/#File.Write

func (f *File) Write(b []byte) (n int, err error)

読み込んだバイトデータを引数にそのままバイト型を与えればいいわけですね。

実行

go run pack_gz_files.go test_dir

実行結果

実行すると output.txt.gzができます。
それを解凍してみると...。

gunzip output.txt.gz

cat output.txt
aaaaaaaaaa
AAAAAAAAAA
1111111111
bbbbbbbbbb
BBBBBBBBBB
2222222222
cccccccccc
CCCCCCCCCC
3333333333

うまくコンカチされてますね。

参考サイト

stackoverflow.com
qiita.com