スクリプトのお勉強

Go言語でtarアーカイブコマンド作成

投稿日:

今所属している会社で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/

-スクリプトのお勉強

執筆者:

関連記事

fastapi + SQLAlchemy で CRUDアプリケーションを作ってみる

概要 勉強用に、PythonでPostgresqlを制御しようと思います。の続きです。 前回でPostgreSQLと、データベース/テーブルまでは用意したので、今回はAPIを作成しようと思います。 実 …

Selenium + Python によるアップロードアプリの動作確認プログラム作成

私の周りでは、なぜかSeleniumが流行っている模様です。 私自身は、Webアプリ的なのも作ってますが、あまり使ってなかったので、使ってみようと思います。 前回作成した、Djangoのupload_ …

go 1.16 でviperを使って設定ファイルを読みだすプログラムを作ってみた

他にたくさんあるけど こんな感じの内容はたくさんあると思いますが、、goの初心者がなんとなくgoの手習いとして、まずは設定ファイルを読みだすことをしてみようと思いました。 go動作環境 windows …

小ネタ: JavaScriptにてBase64エンコード/デコードする方法

小ネタです。JavaScriptにてBase64エンコード/デコードをしようとして、意外と詰まったので、メモ的に方法を書いておきます。 結論: js-base64ライブラリを使用する これだけです。。 …

小ネタ: Ansible , with_itemsをloopに変える方法

とっても小さい小ネタです。 Ansible 2.4(今現在) -> Ansible 2.9に変えたい Ansibleを使用していますが、だいたい2.4ぐらいを使っています。流石にバージョンアップしない …

google オプトアウト Click here to opt-out.