今所属している会社で1バイナリでとりあえず済ませる簡単ツールはgo言語で書くことが多いようです。
私はそれほどgo言語が好きというわけでもありませんが、勉強がてら、ディレクトリからtarアーカイブする簡単ツールを作ってみます。
仕様
作成するコマンドの仕様は以下です。
- 指定したディレクトリ下のtarファイルを作成する
- シンボリックリンクのリンク先はファイル
- ディレクトリの場合は正しく動作しません
普通にシンボリックリンクを指定するとエラーになったので、内部で小細工してます。
環境
- WSL2(ubuntu 20.04 LTS)
- go: 1.18.1
$ sudo apt install golang-go
ソースコード
ここに置きました。
正直、参考にしたのをほぼコピーしたのがほとんどです。
go言語はゼロからコンパイル環境を整えようとすると、ハマるときはハマります。当初は別ディレクトリのライブラリを使用できなくてハマりました。
シンボリックリンク
当初は、filepath.Walkでディレクトリを探索してましたが、シンボリックリンクしたら動作しなかったので、別ライブラリを使用しています。
思ったよりは面倒でしたが、修正は簡単でした。
実行結果
./archive-tar-goコマンドを実行すると以下になります。
$ tree --charset unicode ./testdir/ ./testdir/ `-- usr `-- local |-- test | `-- data.bin `-- text $ ./archive-tar-go `pwd`/testdir output.tar $ tar tvf output.tar tar: Removing leading `/' from member names -rw-r--r-- 0/0 27 2022-08-28 17:29 /usr/local/test/data.bin -rw-r--r-- 0/0 5 2022-08-28 17:29 /usr/local/text
注意としてはシンボリックリンクは、ファイル名は維持しますが、実体ファイルとして扱われます。
参考
- go言語用コマンド作成最初に使用しました
https://debimate.jp/2022/02/05/%E3%80%90golang%E3%80%912022%E5%B9%B4%E3%81%AB%E9%96%8B%E7%99%BA%E3%81%97%E3%81%9F%E8%87%AA%E4%BD%9Ccli%E3%82%B3%E3%83%9E%E3%83%B3%E3%83%89%EF%BC%8F%E3%83%A9%E3%82%A4%E3%83%96%E3%83%A9%E3%83%AA/ - tar実装の参考にしました
https://www.arthurkoziel.com/writing-tar-gz-files-in-go/